#include <stdio.h>
#define NMAX 10001
int n,m,k,ok;
int v[NMAX],w[NMAX];
int *a[NMAX],*b[NMAX],viz[NMAX],e_cuplat[NMAX],viz2[NMAX],vizm1[NMAX];
int sol=0;
void clear(int *a,int n)
{int i;
for(i=1;i<=n;i++)a[i]=0;
}
void copiaza()
{int i;
for(i=1;i<=m;i++)
if(viz2[i])
{
viz[i]=viz2[i];
e_cuplat[viz[i]]=i;
}
}
void rec(int nod,int multime)
{int i,*y,u,m;
u=w[nod];
y=b[nod];
m=1;
if(multime==1){u=v[nod];y=a[nod];m=2;}
if(multime==1&&!e_cuplat[nod])
{
ok=1;
copiaza();
return ;
}
if(multime==2)
for(i=1;i<=u;i++)
if(y[i]!=viz[nod]&&!vizm1[y[i]])
{
viz2[nod]=y[i];
vizm1[y[i]]=nod;
rec(y[i],m);
viz2[nod]=0;
vizm1[y[i]]=0;
if(ok)break;
}
if(multime==1)rec(e_cuplat[nod],m);
}
int main()
{int i,x,y,j;
// clrscr();
freopen("cuplaj.in","r",stdin);
scanf("%d%d%d",&n,&m,&k);
for(i=1;i<=k;i++)
{
scanf("%d%d",&x,&y);
v[x]++;
w[y]++;
}
for(i=1;i<=n;i++)
{
a[i]=new int[v[i]+1];
v[i]=0;
b[i]=new int[w[i]+1];
w[i]=0;
}
fseek(stdin,0,0);
scanf("%d%d%d",&n,&m,&k);
for(i=1;i<=k;i++)
{
scanf("%d%d",&x,&y);
a[x][++v[x]]=y;
b[y][++w[y]]=x;
}
fclose(stdin);
for(i=1;i<=n;i++)
{
for(j=1;j<=v[i]&&!e_cuplat[i];j++)
{
x=a[i][j];
if(!viz[x]){viz[x]=i;e_cuplat[i]=x;a[i][j]*=-1;}
}
}
//for(i=1;i<=m;i++)cout<<i<<' '<<viz[i]<<'\n';
ok=1;
while(ok)
{
ok=0;
for(i=1;i<=m;i++)
if(!viz[i])
{
clear(viz2,m);
clear(vizm1,n);
rec(i,2);
if(ok)break;
}
}
freopen("cuplaj.out","w",stdout);
for(i=1;i<=m;i++)
if(viz[i])sol++;
printf("%d%c",sol,'\n');
for(i=1;i<=m;i++)
if(viz[i])
printf("%d%c%d%c",viz[i],' ',i,'\n');
fclose(stdout);
return 0;
}