#include <stdio.h>
#define MAXN 100
#define INF 2000000000
#define MAXMCH 60000
int nod[MAXMCH], next[MAXMCH], cpc[MAXMCH], fol[MAXMCH], ult[2 * MAXN + 2], dr;
int q[MAXN + 2], prev[MAXN + 2], mch[MAXN + 2];
char viz[MAXN + 2];
inline int min2(int a, int b){
return a < b ? a : b;
}
inline char bfs(int s, int d){
memset(viz, 0, sizeof viz);
int st, dr, p, poz;
q[0] = s;
st = 0;
dr = 1;
while(st < dr){
p = q[st];
st++;
poz = ult[p];
while(poz != -1){
if(!viz[nod[poz]] && cpc[poz] > fol[poz]){
viz[nod[poz]] = 1;
q[dr] = nod[poz];
dr++;
prev[nod[poz]] = p;
mch[nod[poz]] = poz;
}
poz = next[poz];
}
}
return viz[d];
}
inline void add(int x, int y, int c){
nod[dr] = y;
next[dr] = ult[x];
cpc[dr] = c;
ult[x] = dr;
dr++;
}
int main(){
FILE *in = fopen("harta.in", "r");
int n, i, j, x, y, s, d, sum = 0;
fscanf(in, "%d", &n);
s = 2 * n;
d = 2 * n + 1;
memset(ult, -1, sizeof ult);
for(i = 0; i < n; i++){
for(j = 0; j < n; j++){
if(i != j){
add(i, j + n, 1);
add(j + n, i, 0);
add(j, i + n, 1);
add(i + n, j, 0);
}
}
}
for(i = 0; i < n; i++){
fscanf(in, "%d%d", &x, &y);
add(s, i, x);
add(i, s, 0);
add(i + n, d, y);
add(d, i + n, 0);
sum += x;
}
fclose(in);
int augm, poz, p;
while(bfs(s, d)){
poz = ult[d];
while(poz != -1){
prev[d] = nod[poz];
mch[d] = poz - 1;
if(poz & 1 && viz[nod[poz]] && cpc[poz - 1] > fol[poz - 1]){
augm = INF;
p = d;
while(p != s){
augm = min2(augm, cpc[mch[p]] - fol[mch[p]]);
p = prev[p];
}
p = d;
while(p != s){
fol[mch[p]] += augm;
if(mch[p] & 1)
fol[mch[p] - 1] -= augm;
else
fol[mch[p] + 1] -= augm;
p = prev[p];
}
}
poz = next[poz];
}
}
int k = 0;
FILE *out = fopen("harta.out", "w");
fprintf(out, "%d\n", sum);
for(i = 0; i < n; i++){
for(j = 0; j < n; j++){
if(i != j){
if(fol[k] > 0)
fprintf(out, "%d %d\n", i + 1, j + 1);
if(fol[k + 2] > 0)
fprintf(out, "%d %d\n", j + 1, i + 1);
k += 4;
}
}
}
fclose(out);
return 0;
}