#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const int MOD = 1000000007;
const int MX = 1000001;
ll modExp(ll base, ll power) {
if (power == 0) return 1;
ll cur = modExp(base, power / 2);
cur = (cur * cur) % MOD;
if (power % 2) cur = (cur * base) % MOD;
return cur;
}
ll inv(ll x) { return modExp(x, MOD - 2); }
ll mul(ll A, ll B) { return (A * B) % MOD; }
ll add(ll A, ll B) { return (A + B) % MOD; }
ll sub(ll A, ll B) { return (A - B + MOD) % MOD; }
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n, k;
cin >> n >> k;
vector<int> arr(n);
for (int i = 0; i < n; i++) cin >> arr[i];
static bool dp[501][501] = {};
static bool backtrack[501][501] = {};
dp[0][0] = true;
// forward DP: which sums j are reachable using first i elements
for (int i = 0; i < n; i++) {
for (int j = 0; j <= k; j++) {
if (!dp[i][j]) continue;
dp[i+1][j] = true;
if (j + arr[i] <= k)
dp[i+1][j + arr[i]] = true;
}
}
if (!dp[n][k]) {
cout << 0 << "\n";
return 0;
}
// mark (n,k) as reachable in the backtrack table
backtrack[n][k] = true;
for (int i = n; i > 0; i--) {
for (int j = 0; j <= k; j++) {
if (!backtrack[i][j]) continue;
// you can either skip arr[i-1]
backtrack[i-1][j] = true;
// or have taken arr[i-1]
if (j >= arr[i-1]) {
backtrack[i-1][j - arr[i-1]] = true;
}
}
}
// collect all j such that at any prefix i, sum j is on a valid path to (n,k)
set<ll> res;
for (int i = 0; i <= n; i++)
for (int j = 0; j <= k; j++)
if (backtrack[i][j])
res.insert(j);
cout << res.size() << "\n";
for (ll x : res)
cout << x << ' ';
cout << "\n";
return 0;
}