#include <iostream>
#include <fstream>
#include <string.h>
#include <vector>
#include <algorithm>
using namespace std;
ifstream in("lapte.in");
ofstream out("lapte.out");
const int maxn = 105;
const int oo = 0x3f3f3f3f;
int A[maxn];
int B[maxn];
int dp[maxn][maxn];
int dad[maxn][maxn];
int n, l;
bool check(int T)
{
memset(dp, -oo, sizeof(dp));
memset(dad, 0, sizeof(dad));
dp[0][0] = 0;
for(int i = 1; i <= n; i++)
for(int j = 0; j <= l; j++)
for(int k = 0 ; k <= j ; ++ k)
if(T - (j-k) * A[i] >= 0 &&
dp[i][j] < dp[i-1][k] + (T - (j-k) * A[i]) / B[i]) {
dp[i][j] = dp[i-1][k] + (T - (j-k) * A[i]) / B[i];
dad[i][j] = k;
}
return dp[n][l] >= l;
}
int main()
{
/**
dp[i][j] = cantitatea totala de lapte B bauta de primii i oameni,
stiind ca s-a baut j litri de lapte A
toate astea intr-un timp T fixat
dp[i][j] = dp[i - 1][k] + (T - (j - k) * A[i]) / B[i]
dp[n][l] >= l
**/
in >> n >> l;
for(int i = 1; i <= n; i++)
in >> A[i] >> B[i];
int st = 0, dr = 200;
int ret = 0;
while(st <= dr)
{
int mij = (st + dr) / 2;
if(check(mij))
{
ret = mij;
dr = mij - 1;
}
else
st = mij + 1;
}
out << ret;
check(ret);
int i = n, j = l;
vector <pair<int, int> > rasp;
while(i) {
int k = dad[i][j];
int laptea = j - k;
int lapteb = dp[i][j] - dp[i - 1][k];
rasp.push_back(make_pair(laptea, lapteb));
i = i - 1;
j = k;
}
reverse(rasp.begin(), rasp.end());
out << '\n';
for(auto it : rasp)
out << it.first << ' ' << it.second << '\n';
return 0;
}