#include <stdio.h>
#include <vector>
#include <queue>
#include <stack>
#include <list>
#include <set>
#include <algorithm>
#include <utility>
#include <string>
#include <functional>
#include <sstream>
#include <fstream>
using namespace std;
#define FOR(i,a,b) for (typeof a i=a;i<=b;++i)
#define fori(it,v) for (typeof ((v).begin()) it=(v).begin();it!=(v).end();it++)
#define pb push_back
#define mp make_pair
#define fs first
#define ss second
#define all(c) c.begin(),c.end()
#define pf push_front
#define popb pop_back
#define popf pop_front
typedef pair<int,int> ii;
int dest;
vector<int> a[300];
int viz[300][300];
int cap[300][300];
int pred[300];
vector<ii> rez;
int flux()
{
int y,z=1;
queue<int> q;
memset(viz,0,sizeof(viz));
q.push(0);
//printf("WTF %d\n",cap[1][6]);
pred[dest]=0;
while (!q.empty())
{
int nod=q.front();
q.pop();
fori(it,a[nod])
if (cap[nod][*it])
{
pred[*it]=nod;
if(!viz[nod][*it])
{
printf("%d %d\n",nod,*it);
viz[nod][*it]=1;
q.push(*it);
}
if (*it==dest)
{
while (!q.empty())
q.pop();
break;
}
}
}
if (!pred[dest])
return 0;
y=dest;
//printf("Drum : %d, ",dest);
while (y)
{
cap[pred[y]][y]--;
cap[y][pred[y]]++;
y=pred[y];
printf("%d ",y);
}
// printf("\n");
//scanf("%d",&z);
return 1;
}
int main()
{
FILE *in,*out;
int n,i,j,nr,x,y;
in=fopen("harta.in","r");
out=fopen("harta.out","w");
fscanf(in,"%d",&n);
dest=2*n+1;
FOR(i,1,n)
{
fscanf(in,"%d%d",&x,&y);
a[0].pb(i);
a[i].pb(0);
cap[0][i]=x;
a[dest].pb(i+n);
a[i+n].pb(dest);
cap[i+n][dest]=y;
}
FOR(i,1,n)
FOR(j,1,n)
if (i!=j)
{
a[i].pb(j+n);
a[j+n].pb(i);
cap[i][j+n]=1;
}
while (flux());
nr=0;
FOR(i,1,n)
FOR(j,1,n)
if (i!=j&&!cap[i][j+n])
{
nr++;
rez.pb(mp(i,j));
}
fprintf(out,"%d\n",nr);
vector<pair<int,int> >::iterator it;
fori(it,rez)
{
fprintf(out,"%d %d\n",it->fs,it->ss);
}
fclose(in);
fclose(out);
return 0;
}