#include <queue>
#include<stdio.h>
#include <cstring>
using namespace std;
int n,m,e,nr=0;
vector<int> l[10001];
int left[10001],right[10001];
int cupleaza(int u){
int viz[10001],tata[10001],x,a,b,i;
memset(viz,0,sizeof(viz));queue<int> c;
memset(tata,-1,sizeof(tata));
if(right[u]!=-1)
return 0;
// printf ("\n %d: ", u);
c.push(u);
// viz[u]=1;
while(c.size()>0){
x=c.front();
// printf("%d ",x);
c.pop();
for(i=0;i<l[x].size();i++)
if(viz[l[x][i]]==0)
if((left[l[x][i]]!=-1)&&(left[l[x][i]]!=x)){
c.push( left[l[x][i]]);
viz[l[x][i]]=1;
tata[left[l[x][i]]]=x;
}
else{
a=right[x];
right[x]=l[x][i];
left[l[x][i]]=x;
x=tata[x];
while(x!=-1){
b=right[x];
right[x]=a;
left[a]=x;
a=b;
x=tata[x];
}
nr++;
return 1;
}
}
return 0;
}
int main(){
FILE *f,*g;
int i,x,y;
queue<int> c;
f=fopen("cuplaj.in","r");
fscanf(f,"%d %d %d",&n,&m,&e);
int rev=0;
if(n>m){
rev=1;
i=n;
n=m;
m=i;
}
for(i=0;i<e;i++){
fscanf(f,"%d %d",&x,&y);
if(!rev)
l[x-1].push_back(y-1);
else
l[y-1].push_back(x-1);
}
fclose(f);
memset(left,-1,sizeof(left));
memset(right,-1,sizeof(right));
g=fopen("cuplaj.out","w");
int ok=1;
for(i=0;i<n;i++)
cupleaza(i);
fprintf(g,"%d\n",nr);
for(int i=0;i<n;i++)
if(right[i]>=0)
if(!rev)
fprintf(g,"%d %d\n",i+1,right[i]+1);
else
fprintf(g,"%d %d\n",right[i]+1,i+1);
fclose(g);
return 0;
}