//dp[i][j]-numarul maxim de litri b bauti de primii i participanti daca s-au baut j litri a
#include<bits/stdc++.h>
using namespace std;
int a[105],b[105],dp[105][105],n,l,st,dr,mid,sol,val[105][105];
bool ok(int t)
{
for(int i=0;i<=100;i++)
{
for(int j=0;j<=100;j++)
{
dp[i][j]=-10000000;
}
}
dp[0][0]=0;
for(int i=1;i<=n;i++)
for(int k=0;k<=l;k++)
for(int j=0;j<=t/a[i] && j<=k;j++)
if (dp[i][k]<dp[i-1][k-j]+(t-j*a[i])/b[i])
{
val[i][k]=j;
dp[i][k]=dp[i-1][k-j]+(t-j*a[i])/b[i];
}
if(dp[n][l]>=l)
{
return 1;
}
return 0;
}
void ans(int i,int l)
{
if(i==0) return;
ans(i-1,l-val[i][l]);
printf("%d %d\n",val[i][l],(sol-val[i][l]*a[i])/b[i]);
}
bool reconstruieste(int t)
{
for(int i=0;i<=100;i++)
{
for(int j=0;j<=100;j++)
{
dp[i][j]=-10000000;
}
}
dp[0][0]=0;
for(int i=1;i<=n;i++)
for(int k=0;k<=l;k++)
for(int j=0;j<=t/a[i] && j<=k;j++)
if (dp[i][k]<dp[i-1][k-j]+(t-j*a[i])/b[i])
{
val[i][k]=j;
dp[i][k]=dp[i-1][k-j]+(t-j*a[i])/b[i];
}
ans(n,l);
}
int main()
{
freopen("lapte.in","r",stdin);
freopen("lapte.out","w",stdout);
scanf("%d%d",&n,&l);
for(int i=1;i<=n;i++)
{
scanf("%d%d",&a[i],&b[i]);
}
for(int i=1;i<=100;i++)
{
if(ok(i))
{
sol=i;
break;
}
}
printf("%d\n",sol);
reconstruieste(sol);
return 0;
}