#include<fstream>
#include<iostream>
using namespace std;
#define MAX 10010
struct muchie
{
int a,b,c;
muchie *next;
};
muchie *g[MAX*2], tm[MAX*2];
int fmax,n,m,e;
int cmin,t[MAX*2];
void adauga(int i,int j,int cf)
{
muchie *p=new muchie;
p->a=i;
p->b=j;
p->c=cf;
p->next=g[i];
g[i]=p;
}
muchie * adresa(int i,int j)
{
for(muchie *p=g[i];p;p=p->next)
if(p->b==j)
return p;
return NULL;
}
int bfs()
{
int cd[MAX*2];
int st,dr;
st=dr=1;
for(int i=0;i<=n+m+1;i++)
t[i]=-2;
t[0]=-1;
cd[1]=0;
while(st<=dr)
{
for(muchie *p=g[cd[st]];p;p=p->next)
{
int i=p->b;
if(t[i]==-2&&p->c)
{
cd[++dr]=i;
t[i]=cd[st];
}
}
st++;
if(cd[st]==n+m+1)//face pana la capat
return 1;
}
return 0;
}
void flux()
{
muchie *p;
while(bfs())
{
for(int j=n+1;j<=n+m;j++)
{
p=adresa(j,n+m+1);
if(p!=NULL&&p->c!=0&&t[j]!=-2)
{
t[n+m+1]=j;
int i=t[n+m+1];
int min=5;//va deveni 0 sau 1
while(i!=-1)
{
p=adresa(i,n+m+1);
if(p&&p->c<min)
min=p->c;
i=t[i];
}
fmax+=min;
i=t[n+m+1];
while(i!=-1)
{
p=adresa(i,n+m+1);
if(p)
p->c-=min;
p=adresa(n+m+1,i);
if(p)
p->c+=min;
i=t[i];
}
}
}
}
}
int main()
{
int x,y;
FILE *fin=fopen("cuplaj.in","r");
fscanf(fin,"%d%d%d",&n,&m,&e);
for(int i=1;i<=e;i++)
{
fscanf(fin,"%d%d",&x,&y);
adauga(x,y+n,1);
adauga(y+n,x,0);
}
for(int i=1; i<=n;i++)
{
adauga(0,i,1);
adauga(i,0,0);
}
for(int i=n+1; i<=n+m;i++)
{
adauga(i,n+m+1,1);
adauga(n+m+1,i,0);
}
flux();
FILE *fout=fopen("cuplaj.out","w");
fprintf(fout,"%d\n",fmax);
int gasit;
muchie *p;
for(int i=1;i<=n;i++)
for(p=g[i],gasit=0; p && !gasit; p=p->next)
if(p && p->b>n && p->c==0)
fprintf(fout,"%d %d\n",i,p->b-n),gasit=1;
return 0;
}