#include <fstream>
#include <vector>
#include <climits>
#include <bitset>
#define DIM 320
#define X first
#define Y second
using namespace std;
ifstream fin("harta.in");
ofstream fout("harta.out");
int n,i,maxi,dst,minim,x,y,c[DIM],rasp,p,u,k,flux[DIM][DIM],T[DIM],r[DIM][DIM],s;
pair<int,int> sol[5010];
vector<int> L[DIM];
bitset<DIM> f;
int bfs(){
f.reset();
p=u=f[0]=1;
c[1]=0;
while(p<=u){
int nod=c[p];
for(int i=0;i<L[nod].size();i++){
int vec=L[nod][i];
if(f[vec]==0&&(r[nod][vec]-flux[nod][vec]>0)){
c[++u]=vec;
f[vec]=1;
T[vec]=nod;
}
}
p++;
}
return f[n];
}
int main(){
fin>>n;
for(i=1;i<=n;i++){
for(int j=1;j<=n;j++)
if(i!=j){
L[i].push_back(n+j);
L[n+j].push_back(i);
r[i][n+j]=1;
}
}
dst=300;
for(i=1;i<=n;i++){
fin>>x>>y;
L[0].push_back(i);
L[i].push_back(0);
L[n+i].push_back(dst);
L[dst].push_back(n+i);
r[0][i]=x;
r[n+i][dst]=y;
}
while(bfs()){
for(i=0;i<L[dst].size();i++){
int nod=L[dst][i];
if(r[nod][dst]>flux[nod][dst]&&f[nod]==1){
minim=r[nod][dst]-flux[nod][dst];
while(nod){
minim=min(minim,r[T[nod]][nod]-flux[T[nod]][nod]);
nod=T[nod];
}
rasp+=minim;
nod=L[dst][i];
flux[nod][dst]+=minim;
flux[dst][nod]-=minim;
while(nod){
flux[T[nod]][nod]+=minim;
flux[nod][T[nod]]-=minim;
nod=T[nod];
}
}
}
}
for(i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(flux[i][n+j]==1){
sol[++s].X=i;
sol[s].Y=j;
}
fout<<s<<"\n";
for(i=1;i<=s;i++)
fout<<sol[i].X<<" "<<sol[i].Y<<"\n";
return 0;
}