#include <stdio.h>
#define MAXN 100
int timp[MAXN][2], d[MAXN+1][MAXN+1], path[MAXN+1][MAXN+1][MAXN][2];
inline int val(int a, int b, int poz){
return path[a][b][poz][0]*timp[poz][0]+path[a][b][poz][1]*timp[poz][1];
}
inline int max(int a, int b){
return a>b ? a:b;
}
inline int calcul(int a, int b, int ind, int n){
int i, min=2000000000, poz;
for(i=0;i<n;i++)
if(min>val(a,b,i)+timp[i][ind]){
min=val(a,b,i)+timp[i][ind];
poz=i;
}
return poz;
}
inline void copi(int a1, int b1, int a2, int b2, int n){
for(int i=0;i<n;i++){
path[a1][b1][i][0]=path[a2][b2][i][0];
path[a1][b1][i][1]=path[a2][b2][i][1];
}
}
int main()
{
int i, n, L, a, b, poz1, poz2;
FILE *fi=fopen("lapte.in", "r"), *fo=fopen("lapte.out", "w");
fscanf(fi, "%d%d", &n, &L);
for(i=0;i<n;i++){
fscanf(fi, "%d%d", &timp[i][0], &timp[i][1]);
}
for(a=1;a<=L;a++){
poz1=calcul(a-1,0,0,n);
d[a][0]=max(d[a-1][0],val(a-1,0,poz1)+timp[poz1][0]);
copi(a,0,a-1,0,n);
path[a][0][poz1][0]++;
}
for(b=1;b<=L;b++){
poz2=calcul(0,b-1,1,n);
d[0][b]=max(d[0][b-1],val(0,b-1,poz2)+timp[poz2][1]);
copi(0,b,0,b-1,n);
path[0][b][poz2][1]++;
}
for(a=1;a<=L;a++)
for(b=1;b<=L;b++){
poz1=calcul(a-1,b,0,n);
poz2=calcul(a,b-1,1,n);
if(max(d[a-1][b],val(a-1,b,poz1)+timp[poz1][0])<max(d[a][b-1],val(a,b-1,poz2)+timp[poz2][1])){
d[a][b]=max(d[a-1][b],val(a-1,b,poz1)+timp[poz1][0]);
copi(a,b,a-1,b,n);
path[a][b][poz1][0]++;
}
else{
d[a][b]=max(d[a][b-1],val(a,b-1,poz2)+timp[poz2][1]);
copi(a,b,a,b-1,n);
path[a][b][poz2][1]++;
}
}
fprintf(fo, "%d\n", d[L][L]);
for(i=0;i<n;i++)
fprintf(fo, "%d %d\n", path[L][L][i][0], path[L][L][i][1]);
fclose(fi);
fclose(fo);
return 0;
}