#include <bits/stdc++.h>
using namespace std;
ifstream in("lapte.in");
ofstream out("lapte.out");
int n, givenMilk, dp[105][105], ans[105][105];
struct type {
int a, b;
} lp[105];
void clearLast() {
for(int i = 1; i <= n; i++) {
for(int j = 0; j <= givenMilk; j++) {
dp[i][j] = 0;
}
}
}
int avoidZero(int b) {
return b == 0? 0 : 1;
}
int yesOrNo(int ans1, int ans2) {
return ans1 > ans2;
}
int good(int milk) {
clearLast();
int cnt = 0;
for(int i = 0; i <= min(milk / lp[1].a, givenMilk); i++) {
ans[1][i] = i;
dp[1][i] = (milk - lp[1].a * i) / lp[1].b;
}
for(int i = 2; i <= n; i++) {
for(int j = 0; j <= min(milk / lp[i].a, givenMilk); j++) {
for(int k = 0; k <= givenMilk - j; k++) {
if(dp[i - 1][k] >= 0 && dp[i - 1][k] + (milk - lp[i].a * j) / lp[i].b > dp[i][j + k])
{
dp[i][j + k] = dp[i - 1][k] + (milk - lp[i].a * j) / lp[i].b;
ans[i][j + k] = j;
if(j + k >= givenMilk && dp[i][j + k] >= givenMilk) {
cnt++;
}
}
}
}
}
return cnt > 0;
}
void bsearch(int &ans) {
int left = 0, right = 100;
while(left <= right) {
int mid = (left + right) / 2;
if(good(mid)) {
ans = mid;
right = mid - 1;
} else {
left = mid + 1;
}
}
}
void linkPuzzle(int n, int myAns, int givenMilk, int & milkA, int & milkB) {
if(n){
milkA -= ans[n][givenMilk], milkB -= (myAns - ans[n][givenMilk ] * lp[n].a) / lp[n].b;
linkPuzzle(n - 1, myAns, givenMilk - ans[n][givenMilk], milkA , milkB);
out << ans[n][givenMilk] << ' ' << (myAns - ans[n][givenMilk ] * lp[n].a) / lp[n].b << '\n';
}
}
int main()
{
in >> n >> givenMilk;
for(int i = 1; i <= n; i++) {
in >> lp[i].a >> lp[i].b;
}
int myAns = 0, milkA = givenMilk, milkB = givenMilk;
bsearch(myAns);
out << myAns << '\n';
linkPuzzle(n, myAns, givenMilk, milkA, milkB);
/*if(milkA > 0 || milkB > 0) {
cout <<"Incorrect";
}
*/
return 0;
}