#include <cstdio>
#include <cstring>
#include <vector>
#define nmax 105
#define a first
#define b second.first
#define e second.second
using namespace std;
int n, l, A [nmax], B [nmax];
pair <int, pair <int, bool> > f [nmax] [nmax] [nmax];
void scan ()
{
int i;
scanf ("%d%d", &n, &l);
for (i=1; i <= n; ++i) scanf ("%d%d", &A [i], &B [i]);
}
inline int min (int x, int y)
{return (x<y)? x : y;}
bool ok (int w)
{
int i, j, k, v1, v2;
memset (f, 0, sizeof (f));
for (i=0; i <= n; ++i)
f [i] [0] [0].e=true;
for (i=1; i <= n; ++i)
for (j=0; j <= l; ++j)
for (k=0; k <= l; ++k)
{
if (j+k == 0) continue;
//fprintf (stderr, "%d %d %d ", i, j, k);if (e [i-1] [j] [k]) fprintf (stderr, "1\n");
if (f [i-1] [j] [k].e)
{f [i] [j] [k].e=true; f [i] [j] [k].a=f [i] [j] [k].b=0; continue;}
//fprintf (stderr, "!!!!!!!!");
v1=v2=w+1;
if (j != 0 && f [i] [j-1] [k].e)
if (f [i] [j-1] [k].a+f [i] [j-1] [k].b+A [i] <= w) v1=f [i] [j-1] [k].a + f [i] [j-1] [k].b + A [i];
if (k != 0 && f [i] [j] [k-1].e)
if (f [i] [j] [k-1].a+f [i] [j] [k-1].b+B [i] <= w) v2=f [i] [j] [k-1].a + f [i] [j] [k-1].b + B [i];
if (v1 < v2)
{
if (v1 <= w)
{
f [i] [j] [k].a=f [i] [j-1] [k].a+A [i];
f [i] [j] [k].b=f [i] [j-1] [k].b;
f [i] [j] [k].e=true;
}
}
else
{
if (v2 <= w)
{
f [i] [j] [k].a=f [i] [j] [k-1].a;
f [i] [j] [k].b=f [i] [j] [k-1].b+B [i];
f [i] [j] [k].e=true;
}
}
//printf ("%d %d %d %d %d\n", i, j, k, a [i] [j] [k], b [i] [j] [k]);
}
//fprintf (stderr, "%d %d %d\n", w, a [n] [l] [l], l);
return f [n] [l] [l].e;
}
int cbin ()
{
int i, s=1<<30;
for (i=0; s; s >>= 1)
if (!ok (i+s)) i+=s;
return i+1;
}
void print (int w, int x, int y)
{
if (w == 0) return;
int as, bs;
//fprintf (stderr, "%d %d %d %d %d\n", w, x, y, a [w] [x] [y], b [w] [x] [y]);
as=f [w] [x] [y].a/A [w];
bs=f [w] [x] [y].b/B [w];
print (w-1, x-as, y-bs);
printf ("%d %d\n", as, bs);
}
int main ()
{
freopen ("lapte.in", "r", stdin);
freopen ("lapte.out", "w", stdout);
scan ();
int x=cbin ();
printf ("%d\n", x);
ok (x);
print (n, l, l);
return 0;
}