#include <fstream>
#include <cstring>
#include <utility>
#define pii pair< int,int >
#define st first
#define nd second
using namespace std;
ifstream fin("lapte.in");
ofstream fout("lapte.out");
const int MX = 102;
int N,L,Sol;
pii A[MX],B[MX];
int dp[MX][MX],nxt[MX][MX];
bool check(int X)
{
memset(dp,-1,sizeof(dp));
memset(nxt,0,sizeof(nxt));
dp[0][0] = 0;
for (int i = 1;i <= N;i++)
for (int j = 0;j <= L;j++)
{
if (dp[i - 1][j] == -1)
continue;
for (int k = 0;k <= X / A[i].st && j + k <= L;k++)
if (dp[i][j + k] < dp[i - 1][j] + (X - A[i].st * k) / A[i].nd)
{
dp[i][j + k] = dp[i - 1][j] + (X - A[i].st * k) / A[i].nd;
nxt[i][j + k] = k;
}
}
return dp[N][L] >= L;
}
int main()
{
fin >> N >> L;
for (int i = 1;i <= N;i++)
fin >> A[i].st >> A[i].nd;
for (int left = 1,right = MX;left <= right;)
{
int middle = (left + right) / 2;
if (check(middle))
{
Sol = middle;
right = middle - 1;
}
else
left = middle + 1;
}
check(Sol);
/**for (int i = 1;i <= N;i++)
{
for (int j = 0;j <= L;j++)
fout << dp[i][j] << " ";
fout << endl;
}
for (int i = 1;i <= N;i++)
{
for (int j = 0;j <= L;j++)
fout << nxt[i][j] << " ";
fout << endl;
}*/
for (int i = N;i;i--)
{
B[i].st = nxt[i][L];
B[i].nd = (Sol - A[i].st * B[i].st) / A[i].nd;
L -= nxt[i][L];
}
fout << Sol << "\n";
for (int i = 1;i <= N;i++)
fout << B[i].st << " " << B[i].nd << "\n";
return 0;
}