#include <cstdio>
#define IN "ghiozdan.in"
#define OUT "ghiozdan.out"
#define score 100
#define FOR(i,a,b) for(int i=a;i<=b;++i)
#define FOr(i,a,b) for(int i=a;i>=b;--i)
#define G_MAX 1<<8
int max,N,G;
int V[G_MAX],C[1<<17],NR[1<<17];
void scan()
{
int x;
freopen(IN, "r",stdin);
freopen(OUT, "w",stdout);
scanf("%d%d\n", &N,&G);
FOR(i,1,N)
scanf("%d\n", &x),
++V[x],
max = (max<x ? x : max);
}
void solve()
{
int x,y;
NR[0] = 1;
FOr(i,max,1)
{
if(!V[i])
continue;
FOr(j,G-i,0)
{
if(!NR[j])
continue;
FOR(k,1,V[i])
if( j+k*i <= G && !NR[j+k*i])
NR[j+k*i] = NR[j+(k-1)*i] + 1,
C[j+k*i] = j+(k-1)*i;
else
break;
}
}
/*FOR(i,1,10)
printf("%d ",NR[i]);
printf("\n");
FOR(i,1,10)
printf("%d ",C[i]);
printf("\n");
*/
while(!NR[G])
--G;
printf("%d %d\n",G,--NR[G]);
x=G;y = C[G];
printf("%d\n",x-y);
while(C[x])
{
x=y;
y=C[x];
printf("%d\n",x-y);
}
}
int main()
{
scan();
solve();
return 0;
}