# include <stdio.h>
int n, g, a[20001], da[20001], nu[20001], i, t, gmax;
void swap(int &i, int &j)
{
int t;
t=i;
i=j;
j=t;
}
int part(int l, int r)
{
int p, i, j;
p=a[r];
j=l-1;
for (i=l;i<=r;i++)
if (a[i]>=p)
swap(a[++j],a[i]);
return j;
}
void quickS(int l, int r)
{
int poz;
poz=part(l,r);
if (l<poz-1)
quickS(l,poz-1);
if (r>poz+1)
quickS(poz+1,r);
}
void afis(int i, int nr, int t)
{
if (i==0)
{
printf("%d\n",nr);
return ;
}
if (t==1)
{
gmax-=a[i];
if (da[i-1]==gmax)
afis(i-1,nr+1,1);
else
afis(i-1,nr+1,0);
printf("%d\n",a[i]);
}
else
{
if (da[i-1]==gmax)
afis(i-1,nr,1);
else
afis(i-1,nr,0);
}
}
int main()
{
freopen("ghiozdan.in","r",stdin);
freopen("ghiozdan.out","w",stdout);
scanf("%d%d",&n,&g);
for (i=1;i<=n;i++)
scanf("%d",&a[i]);
quickS(1,n);
da[1]=a[1];
nu[1]=0;
for (i=2;i<=n;i++)
{
if (da[i-1]+a[i]<=g && ((da[i-1]>nu[i-1] && nu[i-1]+a[i]<=g) || (nu[i-1]+a[i]>g)))
da[i]=da[i-1]+a[i];
else
if (nu[i-1]+a[i]<=g)
da[i]=nu[i-1]+a[i];
else
da[i]=0;
if (da[i-1]>nu[i-1])
nu[i]=da[i-1];
else
nu[i]=nu[i-1];
}
if (da[n]>nu[n])
{
printf("%d ",da[n]);
t=1;
gmax=da[n];
}
else
{
printf("%d ",nu[n]);
t=0;
gmax=nu[n];
}
afis(n,0,t);
/*for (i=n;i>=1;i--)
if (t==1)
{
printf("%d\n",a[i]);
gmax-=a[i];
if (da[i-1]==gmax)
t=1;
else
t=0;
}
else
{
if (da[i-1]==gmax)
t=1;
else
t=0;
}
*/
return 0;
}