#include<fstream.h>
#include<iostream.h>
#include<stdlib.h>
#define N 10001
#define M 100001
typedef struct nod
{int info;
struct nod *leg;}Nod,*list;
typedef struct
{Nod *prim,*ultim;}coada;
int a[M],b[M],deg[N],*g[N],i,j,k,v[N],dist[N],pair1[N],pair2[N],n,m,t;
long e;
void push(coada &q,int x)
{Nod *px=new Nod;
px->info=x;
px->leg=NULL;
if(q.prim==NULL)
q.prim=q.ultim=px;
else
{q.ultim->leg=px;
q.ultim=px;}}
int pop(coada &q)
{Nod *t=q.prim->leg;
int x=q.prim->info;
free(q.prim);
q.prim=t;
if(q.prim==NULL)
q.ultim=NULL;
return x;}
int bfs(int n,int *g[N],int deg[N],int pair1[N],int pair2[N],int dist[N])
{int i,j,k;
coada q;
q.prim=q.ultim=NULL;
for(i=1;i<=n;i++)
if(pair1[i]==0)
{dist[i]=0;
push(q,i);}
else
dist[i]=M;
dist[0]=M;
while(q.prim!=NULL)
{j=pop(q);
if(j!=0)
{for(k=0;k<deg[j];k++)
if(dist[pair2[g[j][k]]]==M)
{dist[pair2[g[j][k]]]=dist[j]+1;
push(q,pair2[g[j][k]]);}}}
return (dist[0]!=M);}
int dfs(int i,int pair1[N],int pair2[N],int *g[N],int deg[N],int dist[N])
{int j;
if(i!=0)
{for(j=0;j<deg[i];j++)
if(dist[pair2[g[i][j]]]==dist[i]+1&&dfs(pair2[g[i][j]],pair1,pair2,g,deg,dist)==1)
{pair2[g[i][j]]=i;
pair1[i]=g[i][j];
return 1;}
dist[i]=M;
return 0;}
return 1;}
int hopcroft_karp(int n,int m,int pair1[N],int pair2[N],int v[N],int dist[N])
{int i,j,matching=0,k;
for(i=0;i<=n;i++)
pair1[i]=0;
for(k=0;k<=m;k++)
pair2[k]=0;
while(bfs(n,g,deg,pair1,pair2,dist)==1)
{for(j=1;j<=n;j++)
if(pair1[j]==0&&dfs(j,pair1,pair2,g,deg,dist)==1)
{matching++;
v[matching]=j;}}
return matching;}
int main()
{ifstream f1("cuplaj.in");
ofstream f2("cuplaj.out");
f1>>n>>m>>e;
for(i=1;i<=e;i++)
{f1>>a[i]>>b[i];
deg[a[i]]++;}
for(j=1;j<=n;j++)
{g[j]=(int*)malloc(deg[j]*sizeof(int));
deg[j]=0;}
for(k=1;k<=e;k++)
g[a[k]][deg[a[k]]++]=b[k];
t=hopcroft_karp(n,m,pair1,pair2,v,dist);
f2<<t<<endl;
for(i=1;i<=t;i++)
f2<<pair2[pair1[v[i]]]<<" "<<pair1[v[i]]<<endl;
f1.close();
f2.close();
return 0;}