#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#define INF 2000000000
#define MaxN 205
using namespace std;
FILE *IN,*OUT;
int N,L,T,OX;
struct _Din
{
int f,pos,val;
}D[MaxN][MaxN];
struct _Drink
{
int A,B;
}v[MaxN],O[MaxN];
bool GetMax(int val)
{
int X;
memset(D,0,sizeof D);
D[0][0].pos=1;
for(int i=1;i<=N;i++)
for(int j=0;j<=val/v[i].A;j++)
{
X=(val-j*v[i].A)/v[i].B;
for(int k=0;k<=L-j;k++)
if(D[i-1][k].pos)
{
D[i][k+j].pos=1;
if(D[i][k+j].val<D[i-1][k].val+X)
D[i][k+j].val=D[i-1][k].val+X,D[i][k+j].f=k;
}
}
return D[N][L].val>=L;
}
int main()
{
IN=fopen("lapte.in","r");
OUT=fopen("lapte.out","w");
fscanf(IN,"%d%d",&N,&L);
for(int i=1;i<=N;i++)
fscanf(IN,"%d%d",&v[i].A,&v[i].B);
int hi=100,lw=1,mid;
while(hi>=lw)
{
mid=(hi+lw)>>1;
if(GetMax(mid))
T=mid,hi=mid-1;
else lw=mid+1;
}
fprintf(OUT,"%d\n",T);
GetMax(T);
for(int i=N;i>0;i--)
{
O[i].B=D[i][L].val-D[i-1][D[i][L].f].val;
O[i].A=L-D[i][L].f;
L=D[i][L].f;
}
for(int i=1;i<=N;i++)
{
fprintf(OUT,"%d %d\n",O[i].A,O[i].B);
}
return 0;
}