#include <bits/stdc++.h>
using namespace std;
int main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n, k;
cin >> n >> k;
vector<int> c(n);
for(int i = 0; i < n; i++)
cin >> c[i];
static bool dp[501][501] = {};
static bool back[501][501] = {};
dp[0][0] = true;
// 1) Standard subset-sum DP to know which prefixes can make which sums
for(int i = 0; i < n; i++){
for(int s = 0; s <= k; s++){
if(!dp[i][s]) continue;
dp[i+1][s] = true;
if(s + c[i] <= k)
dp[i+1][s + c[i]] = true;
}
}
// 2) Backtrack from (n,k) to mark which (i, sum) lie on *some* path that reaches k
back[n][k] = true;
for(int i = n; i > 0; i--){
for(int s = 0; s <= k; s++){
if(!back[i][s]) continue;
// case 1: we didn’t use coin i–1
if(dp[i-1][s])
back[i-1][s] = true;
// case 2: we did use coin i–1
if(s >= c[i-1] && dp[i-1][s - c[i-1]])
back[i-1][s - c[i-1]] = true;
}
}
// 3) Collect all sums s that appear in back[i][s] for any i
vector<int> ans;
vector<bool> seen(k+1,false);
for(int i = 0; i <= n; i++){
for(int s = 0; s <= k; s++){
if(back[i][s] && !seen[s]){
seen[s] = true;
ans.push_back(s);
}
}
}
sort(ans.begin(), ans.end());
cout << ans.size() << "\n";
for(int x : ans)
cout << x << " ";
cout << "\n";
return 0;
}