#include <iostream>
#include <fstream>
#include <vector>
#include <cstring>
#define dMAX 10000
using namespace std;
int n, m, e;
int x, y;
bool change;
int L[dMAX + 2], R[dMAX + 2], U[dMAX + 2];
vector<int> graf[dMAX + 2];
ifstream fin("cuplaj.in");
ofstream fout("cuplaj.out");
bool PairUp(const int a) {
if (U[a]) return false;
U[a] = true;
int i, j, newV;
for (i = 0; i < graf[a].size(); i++) {
newV = graf[a][i];
if (!R[newV]) {
L[a] = newV;
R[newV] = a;
return true;
}
}
for (i = 0; i < graf[a].size(); i++) {
newV = graf[a][i];
if (PairUp(R[newV])) {
L[a] = newV;
R[newV] = a;
return true;
}
}
return false;
}
int main()
{
int i, j;
fin >> n >> m >> e;
for (i = 1; i <= e; i++) {
fin >> x >> y;
graf[x].push_back(y);
}
change = true;
while (change) {
change = false;
memset(U, false, sizeof(U));
for (i = 1; i <= n; i++) {
if (!L[i]) {
change |= PairUp(i);
}
}
}
int cuplaj = 0;
for (i = 1; i <= n; i++) {
cuplaj += (L[i] > 0);
}
fout << cuplaj << '\n';
for (i = 1; i <= n; i++) {
if (L[i] > 0) {
fout << i << ' ' << L[i] << '\n';
}
}
return 0;
}