#include <stdio.h>
#define MaxN 101
#define FOR(i, a, b) for (i = (a); i <= (b); i++)
#define FORD(i, a, b) for (i = (a); i >= (b); i--)
int N, L;
int A[MaxN], B[MaxN];
int lmax[MaxN][MaxN]; // cant maxima de lapte B pentru daca beau i litri lapte A
int nrl[MaxN][MaxN]; // nrl[i] - nr litri de tip A adaugat pentru a obtine i
int lapte[MaxN], tmin;
int check(int timp)
{
int i, j, k;
FOR(i, 0, 100)
FOR(j, 0, 100) lmax[i][j] = -1, nrl[i][j] = 0;
lmax[0][0] = 0;
FOR(i, 1, N)
FORD(j, L, 0)
if (lmax[i-1][j] != -1)
FORD(k, (timp / A[i]), 0)
{
if (lmax[i-1][j] + (timp - k*A[i]) / B[i] > lmax[i][j + k])
{
lmax[i][j + k] = lmax[i-1][j] + (timp - k*A[i]) / B[i];
nrl[i][j + k] = k;
}
}
if (lmax[N][L] >= L) return 1;
return 0;
}
void afis(int i, int j)
{
if (i == 0) return;
afis(i - 1, j - nrl[i][j]);
lapte[i] = nrl[i][j];
}
int main()
{
int i, j;
FILE *fin = fopen("lapte.in", "rt");
FILE *fout = fopen("lapte.out", "wt");
fscanf(fin, "%d %d", &N, &L);
FOR(i, 1, N)
fscanf(fin, "%d %d", &A[i], &B[i]);
int st = 1, dr = 100;
while (st <= dr)
{
int mij = (st + dr) >> 1;
if (check(mij))
{
tmin = mij;
afis(N, L);
dr = mij - 1;
}
else
st = mij + 1;
}
fprintf(fout, "%d\n", tmin);
FOR(i, 1, N)
fprintf(fout, "%d %d\n", lapte[i], (tmin - lapte[i]*A[i]) / B[i]);
fclose(fin);
fclose(fout);
return 0;
}