#include<cstdio>
#include<vector>
using namespace std;
const int nmax=50005;
vector<int>v[nmax],st,ans;
int from[nmax],to[nmax];
bool viz[nmax];
int main()
{
freopen("domino.in","r",stdin);
freopen("domino.out","w",stdout);
int n,i,u,w,max=-1,first=0;
bool currnum=0;
scanf("%d",&n);
for(i=1;i<=n;i++)
{
scanf("%d%d",&u,&w);
v[u].push_back(i);
v[w].push_back(i);
from[i]=u;
to[i]=w;
if(u>max)
max=u;
else if(w>max)
max=w;
}
for(i=1;i<=max;i++)
{
if(v[i].size()%2)
{
printf("0");
return 0;
}
else if(!first&&v[i].size()!=0)
first=i;
}
int nod,muchie;
st.push_back(first);
while(!st.empty())
{
nod=st.back();
if(!v[nod].empty())
{
muchie=v[nod].back();
v[nod].pop_back();
if(!viz[muchie])
{
ans.push_back(muchie);
viz[muchie]=1;
if(nod==from[muchie])
st.push_back(to[muchie]);
else
st.push_back(from[muchie]);
}
}
else
st.pop_back();
}
if(from[ans[0]]==from[ans[1]]||from[ans[0]]==to[ans[1]])
currnum=1;
else
currnum=0;
printf("1\n%d %d\n",ans[0],currnum);
for(i=1;i<ans.size();i++)
{
if(currnum)
{
if(from[ans[i-1]]==from[ans[i]])
currnum=0;
else
currnum=1;
}
else
{
if(to[ans[i-1]]==from[ans[i]])
currnum=0;
else
currnum=1;
}
printf("%d %d\n",ans[i],currnum);
}
}