#include <bits/stdc++.h>
#define FNAME "TEST"
using namespace std;
typedef long long ll;
const int MAXN = (int)1e3 + 5;
const long long MOD = (long long)29;
#define xd '\n'
#define fi first
#define se second
const long long base = (long long)256;
const int INF = (int)1e4 + 1;
template<class X, class Y>
bool minimize(X &a, Y b) {
if(a > b){
a = b;
return true;
}
return false;
};
template<class X, class Y>
bool maximize(X &a, Y b) {
if(a < b) {
a = b;
return true;
}
return false;
};
void HuuThien() {
ios_base::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
if (fopen(FNAME".inp", "r")) {
freopen(FNAME".inp", "r", stdin);
freopen(FNAME".out", "w", stdout);
}
}
int numX, numY, m;
int matchU[MAXN], matchV[MAXN];
bool visited[MAXN];
vector<int> adj[MAXN];
bool dfs(int u) {
if(visited[u]) return false;
visited[u] = true;
for(int v : adj[u]) {
if((matchV[v] == -1) || dfs(matchV[v])) {
matchU[u] = v;
matchV[v] = u;
return true;
}
}
return false;
}
void Init() {
cin >> numX >> numY >> m;
for(int i = 1; i <= m ; i++) {
int u, v;
cin >> u >> v;
adj[u].push_back(v);
}
}
void Solve() {
memset(matchU, -1, sizeof(matchU));
memset(matchV, -1, sizeof(matchV));
int res = 0;
for(int i = 1; i <= numX ; i++) {
memset(visited, false, sizeof(visited));
if(dfs(i)) {
res++;
}
}
for(int i = 1; i <= numX ; i++) {
if(matchU[i] != -1) {
cout << i << " " << matchU[i] << xd;
}
}
cout << res;
}
signed main() {
HuuThien();
int test = 1;
while(test--) {
Init();
Solve();
}
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CiNkZWZpbmUgRk5BTUUgIlRFU1QiCnVzaW5nIG5hbWVzcGFjZSBzdGQ7CnR5cGVkZWYgbG9uZyBsb25nIGxsOwpjb25zdCBpbnQgTUFYTiA9IChpbnQpMWUzICsgNTsKY29uc3QgbG9uZyBsb25nIE1PRCA9IChsb25nIGxvbmcpMjk7CiNkZWZpbmUgeGQgJ1xuJyAKI2RlZmluZSBmaSBmaXJzdAojZGVmaW5lIHNlIHNlY29uZApjb25zdCBsb25nIGxvbmcgYmFzZSA9IChsb25nIGxvbmcpMjU2Owpjb25zdCBpbnQgSU5GID0gKGludCkxZTQgKyAxOwogCnRlbXBsYXRlPGNsYXNzIFgsIGNsYXNzIFk+IAoJYm9vbCBtaW5pbWl6ZShYICZhLCBZIGIpIHsKCQlpZihhID4gYil7CgkJCWEgPSBiOwoJCQlyZXR1cm4gdHJ1ZTsKCQl9CgkJcmV0dXJuIGZhbHNlOwoJfTsKIAp0ZW1wbGF0ZTxjbGFzcyBYLCBjbGFzcyBZPiAKCWJvb2wgbWF4aW1pemUoWCAmYSwgWSBiKSB7CgkJaWYoYSA8IGIpIHsKCQkJYSA9IGI7CgkJCXJldHVybiB0cnVlOwoJCX0KCQlyZXR1cm4gZmFsc2U7Cgl9OwoJCnZvaWQgSHV1VGhpZW4oKSB7CiAgICBpb3NfYmFzZTo6c3luY193aXRoX3N0ZGlvKDApOwogICAgY2luLnRpZSgwKTsgY291dC50aWUoMCk7ICAgIAogICAgaWYgKGZvcGVuKEZOQU1FIi5pbnAiLCAiciIpKSB7CiAgICAgICAgZnJlb3BlbihGTkFNRSIuaW5wIiwgInIiLCBzdGRpbik7CiAgICAgICAgZnJlb3BlbihGTkFNRSIub3V0IiwgInciLCBzdGRvdXQpOwogICAgfQp9CgppbnQgbnVtWCwgbnVtWSwgbTsKaW50IG1hdGNoVVtNQVhOXSwgbWF0Y2hWW01BWE5dOwpib29sIHZpc2l0ZWRbTUFYTl07CnZlY3RvcjxpbnQ+IGFkaltNQVhOXTsKCmJvb2wgZGZzKGludCB1KSB7CglpZih2aXNpdGVkW3VdKSByZXR1cm4gZmFsc2U7Cgl2aXNpdGVkW3VdID0gdHJ1ZTsKCglmb3IoaW50IHYgOiBhZGpbdV0pIHsKCQlpZigobWF0Y2hWW3ZdID09IC0xKSB8fCBkZnMobWF0Y2hWW3ZdKSkgewoJCQltYXRjaFVbdV0gPSB2OwoJCQltYXRjaFZbdl0gPSB1OwoJCQlyZXR1cm4gdHJ1ZTsKCQl9Cgl9CgoJcmV0dXJuIGZhbHNlOwp9Cgp2b2lkIEluaXQoKSB7CiAgICBjaW4gPj4gbnVtWCA+PiBudW1ZID4+IG07CgoJZm9yKGludCBpID0gMTsgaSA8PSBtIDsgaSsrKSB7CgkJaW50IHUsIHY7CQoJCWNpbiA+PiB1ID4+IHY7CgkJYWRqW3VdLnB1c2hfYmFjayh2KTsKCX0KfQoKdm9pZCBTb2x2ZSgpIHsKICAgIG1lbXNldChtYXRjaFUsIC0xLCBzaXplb2YobWF0Y2hVKSk7CgltZW1zZXQobWF0Y2hWLCAtMSwgc2l6ZW9mKG1hdGNoVikpOwoKCWludCByZXMgPSAwOwoJZm9yKGludCBpID0gMTsgaSA8PSBudW1YIDsgaSsrKSB7CgkJbWVtc2V0KHZpc2l0ZWQsIGZhbHNlLCBzaXplb2YodmlzaXRlZCkpOwoJCWlmKGRmcyhpKSkgewoJCQlyZXMrKzsKCQl9Cgl9CgoJZm9yKGludCBpID0gMTsgaSA8PSBudW1YIDsgaSsrKSB7CgkJaWYobWF0Y2hVW2ldICE9IC0xKSB7CgkJCWNvdXQgPDwgaSA8PCAiICIgPDwgbWF0Y2hVW2ldIDw8IHhkOwoJCX0KCX0KCgljb3V0IDw8IHJlczsJCQkKfQoKc2lnbmVkIG1haW4oKSB7CglIdXVUaGllbigpOwogICAgaW50IHRlc3QgPSAxOwogICAgd2hpbGUodGVzdC0tKSB7CiAgICAgICAgSW5pdCgpOwogICAgICAgIFNvbHZlKCk7CiAgICB9CgogICAgcmV0dXJuIDA7Cn0=