#include <fstream>
using namespace std;
ifstream in("lapte.in");
ofstream out("lapte.out");
const int MAXN = 103;
int d[MAXN][MAXN];//d[i][j] - cantitatea de lapte bauta din tipul B, unde i reprezinta cat lapte
// a fost baut din laptele A, si j reprezinta ultimul bautor
int pred[MAXN][MAXN];//pred[i][j] - cat lapte A a baut bautorul j, in total fiind bauti i litri de lapte A
int n,l;
int tA[MAXN], tB[MAXN];
void citire()
{
in >> n >> l;
for (int i = 1;i <= n;++i)
in >> tA[i] >> tB[i];
}
void dinamica(int t)
{
//initializare primul bautor
for (int cantitate = 0;cantitate <= min(l, t / tA[1]);++cantitate)//cat lapte bea din A
{
d[cantitate][1] = (t - cantitate * tA[1]) / tB[1];
pred[cantitate][1] = cantitate;
}
for (int j = min(l, t / tA[1]) + 1; j <= l;++j)
d[j][1] = -1;
for (int bautor = 2;bautor <= n;++bautor)
for (int cantitate_echipa = 0;cantitate_echipa <= l;++cantitate_echipa)//cat lapte bea echipa in total
{
d[cantitate_echipa][bautor] = -1;
for (int cantitate = 0;cantitate <= min(cantitate_echipa, t / tA[bautor]);++cantitate)//cat lapte bea din A
{
int val = d[cantitate_echipa - cantitate][bautor - 1] +
(t - cantitate * tA[bautor]) / tB[bautor];
if (d[cantitate_echipa - cantitate][bautor - 1] != -1 &&
d[cantitate_echipa][bautor] < val)
{
d[cantitate_echipa][bautor] = val;
pred[cantitate_echipa][bautor] = cantitate;
}
}
}
}
int cautare_binara()
{
int poz = 0;
for (int pas = 1 << 14;pas >= 1;pas >>= 1)
{
dinamica(poz + pas);
if (d[l][n] < l)
poz += pas;
}
return poz + 1;
}
void afisare(int t)
{
out << t << '\n';
int cantitateA[MAXN] = {0};
int cantitateB[MAXN] = {0};
int lapteramas = l,bautor = n;
while(bautor >= 1)
{
int lapte = pred[lapteramas][bautor];
cantitateA[bautor] = lapte;
cantitateB[bautor] = (t - lapte * tA[bautor]) / tB[bautor];
lapteramas -= lapte;
--bautor;
}
for (int i = 1;i <= n;++i)
out << cantitateA[i] << ' ' << cantitateB[i] << '\n';
}
int main()
{
citire();
int t = cautare_binara();
dinamica(t);
afisare(t);
return 0;
}