#include<fstream>
using namespace std;
ifstream in("lapte.in");
ofstream out("lapte.out");
const int NMAX = 100;
const int INFINIT = (1 << 30);
struct lapte{
int a,b;
};
lapte v[NMAX + 10];
int dp[NMAX + 10][NMAX + 10],sol[NMAX + 10][NMAX + 10],n,l,tmin;
void read()
{
in>>n>>l;
for(int i = 1 ; i <= n ; i++)
in>>v[i].a>>v[i].b;
in.close();
}
bool ok(int timp)
{
for(int i = 0 ; i <= n ; i++){
for(int j = 0 ; j <= l ; j++)
dp[i][j] = -INFINIT;
dp[i][0] = 0;
}
for(int i = 1 ; i <= n ; i++){
int maxa = timp/v[i].a;
for(int j = 0 ; j <= min(l,maxa) ; j++){
int maxb = (timp-j*v[i].a)/v[i].b;
for(int k = l ; k >= j ; k--)
if(dp[i][k] < dp[i-1][k-j] + maxb){
dp[i][k] = dp[i-1][k-j] + maxb;
sol[i][k] = maxa;
}
}
}
return dp[n][l] >= l;
}
int solve()
{
int left = 0,right = NMAX + 10,solutie = -1;
while(left <= right){
int mid = (left+right)>>1;
if(ok(mid)){
solutie = mid;
right = mid - 1;
}
else
left = mid + 1;
}
return solutie;
}
void afis(int poz,int litrii)
{
if(!poz)
return;
afis(poz-1,litrii-sol[poz][litrii]);
out<<sol[poz][litrii]<<" "<<(tmin-v[poz].a*sol[poz][litrii])/v[poz].b<<"\n";
}
int main()
{
read();
tmin = solve();
ok(tmin);
out<<tmin<<"\n";
afis(n,l);
return 0;
}