#include<cstdio>
#include<algorithm>
#include<functional>
#include<vector>
using namespace std;
int N, M;
int dp[10000+5][100+5];
int v[10000 + 5];
int main()
{
scanf("%d %d",&N,&M);
for(int i = 1; i <=N; i++ ) scanf("%d",&v[i]);
sort(v+1, v +1+ N, greater<int>());
for (int i = 1; i <=N; i++)
for (int j = 0; j <=M; j++){
dp[i][j] = dp[i - 1][j];
if (j >= v[i])
dp[i][j] = dp[i][j]>dp[i - 1][j - v[i]] + v[i] ? dp[i][j] : dp[i - 1][j - v[i]] + v[i];
}
if (dp[N][M] != M){
printf("No Solution");
return 0;
}
vector<int> V;
for (int i = N,j = M ; i > 0; i--){
if (dp[i][j] == dp[i - 1][j - v[i]]+v[i]){
V.push_back(v[i]);
j -= v[i];
}
}
for (int i = 0; i<V.size(); i++){
i == 0 ? printf("") : printf(" ");
printf("%d", V[i]);
}
return 0;
}
#include<algorithm>
#include<functional>
#include<vector>
using namespace std;
int N, M;
int dp[10000+5][100+5];
int v[10000 + 5];
int main()
{
scanf("%d %d",&N,&M);
for(int i = 1; i <=N; i++ ) scanf("%d",&v[i]);
sort(v+1, v +1+ N, greater<int>());
for (int i = 1; i <=N; i++)
for (int j = 0; j <=M; j++){
dp[i][j] = dp[i - 1][j];
if (j >= v[i])
dp[i][j] = dp[i][j]>dp[i - 1][j - v[i]] + v[i] ? dp[i][j] : dp[i - 1][j - v[i]] + v[i];
}
if (dp[N][M] != M){
printf("No Solution");
return 0;
}
vector<int> V;
for (int i = N,j = M ; i > 0; i--){
if (dp[i][j] == dp[i - 1][j - v[i]]+v[i]){
V.push_back(v[i]);
j -= v[i];
}
}
for (int i = 0; i<V.size(); i++){
i == 0 ? printf("") : printf(" ");
printf("%d", V[i]);
}
return 0;
}