#include <bits/stdc++.h>
using namespace std;
int dfn[100010], low[100010], n, m, q, cnt = 0, pcc = 0;
int dep[100010 * 2], dis[100010 * 2], anc[100010 * 2][20];
bool in[100010], vis[100010 * 2];
stack<int> stk;
vector<int> nxt[100010], G[100010 * 2];
void read(int &x) {
  char ch = x = 0;
  while (!isdigit(ch)) ch = getchar();
  while (isdigit(ch)) x = x * 10 + ch - '0', ch = getchar();
}
void tarjan(int x, int fa) {
  dfn[x] = low[x] = ++cnt;
  in[x] = 1, stk.push(x);
  for (int v : nxt[x]) {
    if (v == fa) continue;
    if (!dfn[v]) {
      tarjan(v, x), low[x] = min(low[x], low[v]);
      if (low[v] >= dfn[x]) {
        pcc++;
        while (stk.top() != v) {
          G[stk.top()].push_back(n + pcc), G[n + pcc].push_back(stk.top());
          in[stk.top()] = 0, stk.pop();
        }
        G[x].push_back(n + pcc), G[n + pcc].push_back(x);
        in[v] = 0, stk.pop();
        G[v].push_back(n + pcc), G[n + pcc].push_back(v);
      }
    } else if (in[v])
      low[x] = min(low[x], dfn[v]);
  }
}
void dfs(int x, int an, int dp, int di) {
  anc[x][0] = an, dep[x] = dp, dis[x] = di;
  vis[x] = 1;
  for (int v : G[x]) {
    if (v == an) continue;
    dfs(v, x, dp + 1, di + (v <= n));
  }
}
int lca(int x, int y) {
  if (dep[x] < dep[y]) swap(x, y);
  for (int i = 19; ~i; i--)
    if (dep[anc[x][i]] >= dep[y]) x = anc[x][i];
  if (x == y) return x;
  for (int i = 19; ~i; i--)
    if (anc[x][i] != anc[y][i]) x = anc[x][i], y = anc[y][i];
  return anc[x][0];
}
int main() {
  read(n), read(m), read(q);
  for (int i = 1, x, y; i <= m; i++)
    read(x), read(y), nxt[x].push_back(y), nxt[y].push_back(x);
  tarjan(1, 0);
  dfs(1, 0, 1, 1);
  for (int j = 1; j <= 19; j++)
    for (int i = 1; i <= n + pcc; i++) anc[i][j] = anc[anc[i][j - 1]][j - 1];
  for (int i = 1, x, y; i <= q; i++) {
    read(x), read(y);
    int LCA = lca(x, y);
    printf("%d\n", dis[x] + dis[y] - dis[LCA] - dis[anc[LCA][0]] - 1);
  }
  return 0;
}
