#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int n, l, b[101], a[101], ca, cb, ord1[101], ord2[101], timp[101], reconst;
int tmpa[101], tmpb[101];
int min(int x, int y) { return x < y ? x : y;}
int cmp1(const void *x, const void *y)
{
int i = *(int*)x, j = *(int*)y;
return a[i] - a[j];
}
int cmp2(const void *x, const void *y)
{
int i = *(int*)x, j = *(int*)y;
return b[i] - b[j];
}
void citire()
{
freopen("lapte.in","r",stdin);
freopen("lapte.out","w",stdout);
scanf("%d %d", &n, &l);
int i;
for (i=1; i<=n; i++)
{
scanf("%d %d",&a[i], &b[i]);
ord1[i] = ord2[i] = i;
}
}
void doit(int t, int &ta, int &tb, int a[], int b[])
{
int j, sa, sb, x;
memset(timp, 0, sizeof(timp));
if (reconst)
{
memset(tmpa,0,sizeof(tmpa));
memset(tmpb,0,sizeof(tmpb));
}
sa = 0; sb = 0;
for (j = 1; ta < l && j <= n; j++)
{
x = l - ta;
tmpa[ord1[j]] = min((t-timp[ord1[j]]) / a[ord1[j]],x);
ta += tmpa[ord1[j]];
timp[ord1[j]] += min(((t - timp[ord1[j]]) / a[ord1[j]] * a[ord1[j]]),(x * a[ord1[j]]));
}
for (j = 1; tb < l && j <= n; j++)
{
x = l - tb;
tmpb[ord2[j]] = min(((t - timp[ord2[j]]) / b[ord2[j]]), x);
tb += tmpb[ord2[j]];
timp[ord2[j]] += min(((t - timp[ord2[j]]) / b[ord2[j]] * b[ord2[j]]),(x * b[ord2[j]]));
}
}
int verif(int T)
{
int aa, bb;
aa = bb = 0;
doit(T,aa,bb,a,b);
if (aa >= l && bb >= l) return 1;
return 0;
}
int search()
{
int p, u, m;
p = 1; u =30;
while (p <= u)
{
m = (p + u) / 2;
if (verif(m) && !verif(m - 1)) return m;
else if (verif(m - 1)) u = m - 1;
else if (!verif(m)) p = m + 1;
}
return 0;
}
int main()
{
citire();
qsort(ord1,n+1,sizeof(int),cmp1);
qsort(ord2,n+1,sizeof(int),cmp2);
int rez = search();
reconst = 1;
verif(rez);
printf("%d\n",rez);
for (int i = 1; i <= n; i++) printf("%d %d\n",tmpa[i] , tmpb[i] );
return 0;
}