#include <cstdio>
#include <vector>
#include <queue>
using namespace std;
const int N = 3005;
vector < int > G[N], H[N], tree[N];
bool b[N][N], c[N][N];
// c[u][v] 删除 fa[u] 后从 v 是否能到达 u.
// b[u][v] 删除 u 后从 1 是否能到达 v.
int cnt[N], fa[N], sz[N];
void dfs(int u) {
sz[u] = 1;
for (int v : H[u]) {
dfs(v);
sz[u] += sz[v];
}
}
int max(int a, int b) {
return a > b ? a : b;
}
int main() {
// freopen("in.txt", "r", stdin);
int n, m, q;
scanf("%d %d %d", &n, &m, &q);
for (int u, v; m != 0; m--) {
scanf("%d %d", &u, &v);
G[u].push_back(v);
}
for (int del = 2; del <= n; del++) {
queue < int > q;
q.push(1);
while (!q.empty()) {
int u = q.front();
b[del][u] = true;
q.pop();
for (int v : G[u]) {
if (v != del && !b[del][v]) {
q.push(v);
}
}
}
for (int u = 1; u <= n; u++) {
if (!b[del][u]) {
cnt[u]++;
}
}
}
for (int u = 2; u <= n; u++) {
for (int f = 1; f <= n; f++) {
if (!b[f][u]) {
if (cnt[f] == cnt[u] - 1) {
fa[u] = f;
}
}
}
H[fa[u]].push_back(u);
}
dfs(1);
for (int u = 1; u <= n; u++) {
H[u].clear();
}
for (int u = 1; u <= n; u++) {
for (int v : G[u]) {
H[v].push_back(u);
}
}
for (int x = 2; x <= n; x++) {
queue < int > q;
q.push(x);
while (!q.empty()) {
int u = q.front();
c[x][u] = true;
q.pop();
for (int v : H[u]) {
if (v != fa[x] && !c[x][u]) {
q.push(v);
}
}
}
}
for (int u, v; q != 0; q--) {
scanf("%d %d", &u, &v);
int ans = 0;
for (int x = 2; x <= n; x++) {
if (b[fa[x]][u] && c[x][v]) {
ans = max(ans, sz[x]);
}
}
printf("%d\n", ans);
}
return 0;
}