#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
const char iname[] = "cuplaj.in";
const char oname[] = "cuplaj.out";
#define MAXN 10005
#define FOR(i, a, b) for (int i = (int)(a); i <= (int)(b); ++ i)
#define FORI(i, V) for (vector <int>::iterator i = (V).begin(); i != (V).end(); ++ i)
vector <int> G[MAXN];
int l[MAXN], r[MAXN], u[MAXN];
int pairup(const int n)
{
if (u[n]) return 0;
u[n] = 1;
FORI (i, G[n]) if (!r[*i]) {
l[n] = *i;
r[*i] = n;
return 1;
}
FORI (i, G[n]) if (pairup(r[*i])) {
l[n] = *i;
r[*i] = n;
return 1;
}
return 0;
}
int main(void)
{
freopen(iname, "r", stdin);
freopen(oname, "w", stdout);
int n, m, cnt_edges;
scanf("%d %d %d", &n, &m, &cnt_edges);
for (; cnt_edges --; )
{
int x, y;
scanf("%d %d", &x, &y);
G[x].push_back(y);
}
for (int change = 1; change; )
{
change = 0;
memset(u, 0, sizeof(u));
FOR (i, 1, n) if (!l[i])
change |= pairup(i);
}
int cuplaj = 0;
FOR (i, 1, n) cuplaj += (l[i] > 0);
printf("%d\n", cuplaj);
FOR (i, 1, n) if (l[i] > 0)
printf("%d %d\n", i, l[i]);
return 0;
}
/*# include <fstream>
# include <iostream>
# include <cstdlib>
using namespace std;
int *a[10003], n, m , e, l[10003], r[10003], u[10003];
void add (int i, int j)
{
a[i][0]++;
a[i]=(int *)realloc(a[i], (a[i][0]+1)*4);
a[i][a[i][0]]=j;
}
void read ()
{
ifstream fin ("cuplaj.in");
fin>>n>>m>>e;
for (int i=1;i<=n;i++)
{
a[i]=(int *)malloc(4);
a[i][0]=0;
}
int x, y;
for (int i=1;i<=e;i++)
{
fin>>x>>y;
add(x, y);
}
}
int pairup (int k)
{
if (u[k])
return 0;
u[k]=1;
for (int i=1;i<=a[k][0];i++)
if (!r[a[k][i]])
{
l[k]=a[k][i];
r[a[k][i]]=k;
return 1;
}
for(int i=1;i<=a[k][0];i++)
if ( pairup( r[a[k][i]] ) )
{
l[k]=a[k][i];
r[a[k][i]]=k;
return 1;
}
return 0;
}
void solve ()
{
int gata=0;
while (!gata)
{
gata=1;
for(int i=1;i<=n;i++)
u[i]=0;
for (int i=1;i<=n;i++)
if (!l[i])
{
cout<<i<<endl;
gata=0;
pairup(i);
}
}
}
void write ()
{
ofstream fout ("cuplaj.out");
int cuplaj=0;
for (int i=1;i<=n;i++)
if (l[i]!=0)
cuplaj++;
fout<<cuplaj<<endl;
for (int i=1;i<=n;i++)
if (!l[i])
fout<<i<<" "<<l[i]<<endl;
}
int main ()
{
read();
solve ();
write ();
return 0;
}
/*# include <vector>
# include <iostream>
# include <algorithm>
# include <cstdio>
using namespace std;
vector<int>g[10003];
int l[10003], r[10003], u[10003], n, m, e;
void read ()
{
freopen ("cuplaj.in", "r", stdin);
scanf("%d%d%d", &n, &m, &e);
for (;e--;)
{
int x, y;
scanf("%d%d", &x, &y);
g[x].push_back(y);
}
}
int pereche (int k)
{
if (u[k])
return 0;
cout<<"$";
u[k]=1;
for (vector<int>::iterator I=g[k].begin();I!=g[k].end();++I)
if (!r[*I])
{
cout<<*I<<endl;
l[k]=*I;
r[*I]=n;
return 1;
}
for (vector<int>::iterator I=g[k].begin();I!=g[k].end();++I)
if (pereche(r[*I]))
{
l[k]=*I;
r[*I]=k;
return 1;
}
return 0;
}
void solve ()
{
int gata=0;
while (!gata)
{
gata=1;
for (int i=1;i<=n;++i)
u[i]=0;
for (int i=1;i<=n;++i)
if (!l[i])
{
cout<<i<<endl;cout.flush();
gata=0;
pereche(0);
// cout<<i;
}
}
}
void write ()
{
int cuplaj=0;
for (int i=1;i<=n;i++)
if (l[i]>0)
cuplaj++;
freopen("cuplaj.out", "w", stdout);
printf("%d\n", cuplaj);
for(int i=1;i<=n;i++)
if (l[i]>0)
printf("%d %d\n", i, l[i]);
}
int main ()
{
read();
for (int i=1;i<=n;i++)
{
cout<<i<<" : ";
for (vector<int>::iterator I=g[i].begin();I!=g[i].end();++I)
cout<<*I<<" ";
cout<<endl;
}
solve ();
write ();
return 0;
}
*/