#include <stdio.h>
#include <string.h>
#include <vector>
#define NMax 10010
using namespace std;
const char IN[] = "cuplaj.in", OUT[] = "cuplaj.out";
int N, M, K, Rez;
int L[NMax], R[NMax];
bool visit[NMax];
vector<int> ad[NMax];
bool cupleaza(int x) {
if (visit[x]) return false;
visit[x] = true;
for (int i = 0 ; i < (int) ad[x].size(); ++ i ) if ( !R[ad[x][i]] ) {
R[ad[x][i]] = x;
L[x] = ad[x][i];
return true;
}
for (int i = 0 ; i < (int) ad[x].size(); ++ i )
if ( cupleaza(R[ad[x][i]]) ) {
R[ad[x][i]] = x;
L[x] = ad[x][i];
return true;
}
return false;
}
int main() {
int x, y;
freopen(IN, "r", stdin);
scanf("%d%d%d", &N, &M, &K);
for (int i = 1 ; i <= K ; ++ i ) {
scanf("%d%d", &x, &y);
ad[x].push_back(y);
}
for ( int s = 1; s ; ) {
s = 0;
memset(visit, 0, sizeof(visit));
for (int i = 1; i <= N ; ++ i) if ( !L[i] )
s |= cupleaza(i);
}
for (int i = 1; i <= N ; ++ i) Rez += ( L[i] != 0 );
freopen(OUT, "w", stdout);
printf("%d\n", Rez);
for (int i = 1; i <= N ; ++ i ) if ( L[i] )
printf("%d %d\n", i, L[i]);
fclose(stdout);
return 0;
}