#include <queue>#include <cctype>#include <cstdio>#include <vector>#include <algorithm>using namespace std;inline int nextInt() { static int ch = 0; int ret = 0; while (!isdigit(ch = getchar())) { continue; } do { ret *= 10; ret += ch - '0'; } while (isdigit(ch = getchar())); return ret;}const int MAXN = 100001;int n, m, d, a, b;vector<int> e[MAXN];int c[MAXN];int gao(int cur) { static int c[MAXN]; int ans = 0; queue<int> q[2]; copy(::c, ::c + n + m, c); for (int i = 0; i < n; ++i) { if (c[i] == 0) { q[0].push(i); } } for (int i = 0; i < m; ++i) { if (c[n + i] == 0) { q[1].push(n + i); } } while (!q[0].empty() || !q[1].empty()) { ++ans; while (!q[cur].empty()) { for (int i = 0; i < e[q[cur].front()].size(); ++i) { int v = e[q[cur].front()][i]; --c[v]; if (c[v] == 0) { q[v >= n].push(v); } } q[cur].pop(); } cur = 1 - cur; } return ans + 1;}int main() { while (true) { n = nextInt(); m = nextInt(); d = nextInt(); if (n == 0 && m == 0 && d == 0) { break; } for (int i = 0; i < n + m; ++i) { e[i].clear(); c[i] = 0; } for (int i = 0; i < d; ++i) { a = nextInt() - 1; b = nextInt() - 1; e[b].push_back(a); ++c[a]; } printf("%dn", min(gao(0), gao(1))); } return 0;}