using namespace std;
#include <algorithm>
#include <vector>
#include <cstdio>
#include <utility>
#include <functional>
#define FOR(i,a,b) for(int i=a;i<=b;++i)
#define N_MAX 1<<7
#define o first.first
#define f first.second
#define s second.first
#define poz second.second
#define IN "lapte.in"
#define OUT "lapte.out"
#define II inline
vector< pair< pair<int,int> ,pair<int,int> > > V(N_MAX),S(N_MAX);
char buffer[1<<10];
int MIJ,rez(1<<29),VA,VB,K(-1),N,L;
II int read()
{
int aux(0);
for(;buffer[K] > '9' || buffer[K] < '0';++K);
for(;buffer[K] <= '9' && buffer[K] >= '0';++K)
aux = aux * 10 + buffer[K] - '0';
return aux;
}
II void scan()
{
freopen(OUT,"w",stdout);
freopen(IN, "r",stdin);
fread(buffer,1,1<<10,stdin);
fclose(stdin);
N = read();
L = read();
V.resize(N+1);
S.resize(N+1);
FOR(i,1,N)
{
V[i].f = read();
V[i].s = read();
V[i].poz = i;
V[i].o = V[i].f - V[i].s;
}
sort(V.begin()+1, V.end() );
MIJ = N;
FOR(i,1,N)
if(V[i].o > 0)
{
MIJ = i-1;
break;
}
FOR(i,1,N)
S[i].o = V[i].poz;
}
II bool ok(int T)
{
int a = L,b = L;
FOR(i,1,MIJ)
{
S[i].f = min(T / V[i].f,a);
a -= min(T / V[i].f,a);
S[i].s = min( (T - S[i].f * V[i].f) / V[i].s,b);
b -= min( (T - S[i].f * V[i].f) / V[i].s,b);
}
FOR(i,MIJ+1,N)
{
S[i].s = min(T / V[i].s,b);
b -= min(T / V[i].s,b);
S[i].f = min( (T - S[i].s * V[i].s) / V[i].f,a);
a -= min( (T - S[i].s * V[i].s) / V[i].f,a);
}
if(a <= 0 && b <=0)
return true;
if(a > 0 && b > 0)
return false;
if(a > 0)
for(int i=MIJ+1;i<=N && a > 0;++i)
{
b += min(T / V[i].s,b);
a += min( (T - S[i].s * V[i].s) / V[i].f,a);
S[i].f = min(T / V[i].f,a);
a -= min(T / V[i].f,a);
S[i].s = min( (T - S[i].f * V[i].f) / V[i].s,b);
b -= min( (T - S[i].f * V[i].f) / V[i].s,b);
}
if(b > 0)
for(int i=MIJ;i>=1 && b > 0;--i)
{
a += S[i].f;
b += S[i].s;
S[i].s = min(T / V[i].s,b);
b -= min(T / V[i].s,b);
S[i].f = min( (T - S[i].s * V[i].s) / V[i].f,a);
a -= min( (T - S[i].s * V[i].s) / V[i].f,a);
}
if(a>0 || b>0)
return false;
return true;
}
II void print();
II void solve()
{
FOR(i,1,N)
VA += V[i].f,
VB += V[i].s;
int T,step;
for(step = 1; step <= 100; step <<= 1);
for(T = 1; step; step >>= 1)
if(T + step <= 100 && !ok(T+step-1) )
T += step;
ok(T);
if(T > rez)
return;
rez = T;
sprintf(buffer,"%d\n",T);
sort(S.begin()+1,S.end());
print();
}
II void print()
{
FOR(i,1,N)
sprintf(buffer,"%s%d %d\n",buffer,S[i].f,S[i].s);
//freopen(OUT,"w",stdout);
printf("%s",buffer);
fclose(stdout);
}
int main()
{
scan();
solve();
return 0;
}