#include <cstdio>
#include <vector>
using namespace std;
const int MAXN = 10005;
int n,m;
vector<int> vecini[MAXN];
bool vizitat[MAXN];
int st[MAXN], dr[MAXN];
void citire()
{
freopen("cuplaj.in","r",stdin);
freopen("cuplaj.out","w",stdout);
int nrmch;
scanf("%d%d%d",&n,&m,&nrmch);
for (int i = 1;i <= nrmch;++i)
{
int x,y;
scanf("%d%d",&x,&y);
vecini[x].push_back(y);
}
}
bool cuplare(int x)
{
if (vizitat[x])
return false;
vizitat[x] = true;
for (unsigned int i = 0;i < vecini[x].size();++i)
{
int vecin = vecini[x][i];
if (st[vecin] == 0)
{
dr[x] = vecin;
st[vecin] = x;
return true;
}
}
for (unsigned int i = 0;i < vecini[x].size();++i)
{
int vecin = vecini[x][i];
if(cuplare(st[vecin]))
{
dr[x] = vecin;
st[vecin] = x;
return true;
}
}
return false;
}
int main()
{
citire();
bool continuare = true;
while(continuare)
{
continuare = false;
for (int i = 1;i <= n;++i)
vizitat[i] = false;
for (int i = 1;i <= n;++i)
if (dr[i] == 0)
continuare = continuare || cuplare(i);
}
int nrcuplaj = 0;
for (int i = 1;i <= n;++i)
if (dr[i] != 0)
++nrcuplaj;
printf("%d\n", nrcuplaj);
for (int i = 1;i <= n;++i)
if (dr[i] != 0)
printf("%d %d\n",i,dr[i]);
return 0;
}