#include <bits/stdc++.h>
#define INF 0x3f3f3f3f
#define NMax 102
using namespace std;
ifstream f("lapte.in");
ofstream g("lapte.out");
struct info2{
int x,y,ind;
};
info2 v[NMax],a[NMax],b[NMax];
int n,l;
bool verif(int x){
int lA = l, lB = l;
for(int i = 1; i <= n; ++i){
v[i].x = 0;v[i].y = 0;
}
for(int i = 1; i <= n && lA; ++i){
if(lA - (x / a[i].x) > 0){
lA -= (x / a[i].x);
v[a[i].ind].x = (x / a[i].x);
}else{
v[a[i].ind].x = lA;
lA = 0;
}
}
for(int i = 1; i <= n && lB; ++i){
int w = (x - v[b[i].ind].x * b[i].x);
if(lB - (w / b[i].y) > 0){
lB -= (w / b[i].y);
v[b[i].ind].y = (w / b[i].y);
}else{
v[b[i].ind].y = lB;
lB = 0;
}
}
if(lA == 0 && lB == 0)
return 1;
for(int i = 1; i <= n; ++i){
v[i].x = 0;v[i].y = 0;
}
lA = l, lB = l;
for(int i = 1; i <= n && lB; ++i){
if(lB - (x / b[i].y) > 0){
lB -= (x / b[i].y);
v[b[i].ind].y = (x / b[i].y);
}else{
v[b[i].ind].y = lB;
lB = 0;
}
}
for(int i = 1; i <= n && lA; ++i){
int w = (x - v[a[i].ind].y * a[i].y);
if(lA - (w / a[i].x) > 0){
lA -= (w / a[i].x);
v[a[i].ind].x = (w / a[i].x);
}else{
v[a[i].ind].x = lA;
lA = 0;
}
}
if(lA == 0 && lB == 0)
return 1;
return 0;
}
void cautbin(int lo,int hi){
int mid;
while(lo <= hi){
mid = (lo + hi) / 2;
int ok2 = verif(mid - 1);
int ok1 = verif(mid);
if(ok1 == 1 && ok2 == 0){
g << mid << '\n';
for(int i = 1; i <= n; ++i){
g << v[i].x << ' ' << v[i].y << '\n';
}
return;
}else
if(ok1 == 1){
hi = mid - 1;
}else
if(ok2 == 0){
lo = mid + 1;
}
}
}
bool cmp1(info2 x, info2 y){
return(x.x < y.x);
}
bool cmp2(info2 x, info2 y){
return(x.y < y.y);
}
int main()
{
f >> n >> l;
for(int i = 1; i <= n; ++i){
f >> a[i].x >> a[i].y; a[i].ind = i;
b[i].x = a[i].x; b[i].y = a[i].y; b[i].ind = i;
}
sort(a + 1, a + 1 + n,cmp1);
sort(b + 1, b + 1 + n,cmp2);
cautbin(1,INF);
return 0;
}