#include <bits/stdc++.h>
#define MOD 998244353
#define EPS 0.000000001
#define loop(i, a, b) for(int i = a; i < b; i++)
#define loop_step(i, a, b, c) for(int i = a; i < b; i += c)
#define loop_inv(i, a, b) for(int i = a; i > b; i--)
#define pb push_back
#define val first
#define lazy second
#define enter cout << "\n"
typedef long long ll;
using namespace std;
void read(){}
void write(){}
template <typename T, typename ...Args>
void write(T& first, Args&... args){
cout << first << " ";
write(args...);
}
template <typename T, typename ...Args>
void read(T& first, Args&... args){
cin >> first;
read(args...);
}
struct person{
int La, Lb, ind;
};;
bool greedy(int x, int n, int l, vector <person> &v, vector <person> &comp){
int Qa = l, Qb = l;
loop(i, 1, n + 1){
comp[i].La = comp[i].Lb = 0;
}
loop(i, 1, n + 1){
comp[i].La = min(Qa, x / v[i].La);
comp[i].Lb = (x - v[i].La * comp[i].La) / v[i].Lb;
Qa -= comp[i].La;
Qb -= comp[i].Lb;
}
return Qa <= 0 && Qb <= 0;
}
int main() {
int n, l;
freopen("lapte.in", "r", stdin);
freopen("lapte.out", "w", stdout);
read(n, l);
vector <person> v(n + 1), comp(n + 1);
loop(i, 1, n + 1){
read(v[i].La, v[i].Lb);
v[i].ind = i;
}
sort(v.begin() + 1, v.begin() + 1 + n, [](const person &x, const person &y){
return x.La - x.Lb < y.La - y.Lb;
});
int pas = 1 << 8, sol = 0;
while(pas){
if(!greedy(sol + pas, n, l, v, comp)){
sol += pas;
}
pas /= 2;
}
++sol;
greedy(sol, n, l,v, comp);
loop(i, 1, n + 1){
comp[i].ind = v[i].ind;
}
sort(comp.begin() + 1, comp.begin() + 1 + n, [](const person &x, const person &y){
return x.ind < y.ind;
});
write(sol);
enter;
loop(i, 1, n + 1){
write(comp[i].La, comp[i].Lb);
enter;
}
return 0;
}