#include <bits/stdc++.h>
using namespace std;
struct edge {
  int v, nxt;
} e[1000005 << 1];
int p[1000005], eid;
void init() {
  memset(p, -1, sizeof p);
  eid = 0;
}
void insert(int u, int v) {
  e[eid].v = v;
  e[eid].nxt = p[u];
  p[u] = eid++;
}
int n, m, low[1000005], dfn[1000005], tot, sta[1000005], sz, bel[1000005],
    insta[1000005], top, dep[1000005];
vector<int> g[1000005];
void add(int u, int v) { g[u].push_back(v), g[v].push_back(u); }
void dfs(int u) {
  low[u] = dfn[u] = ++tot;
  sta[++top] = u;
  insta[u] = 1;
  for (int i = p[u]; i + 1; i = e[i].nxt) {
    int v = e[i].v;
    if (!dfn[v]) {
      dfs(v), low[u] = min(low[u], low[v]);
      if (low[v] >= dfn[u]) {
        ++sz;
        add(u, sz);
        while (sta[top] != v)
          add(sta[top], sz), bel[sta[top]] = sz, insta[sta[top--]] = 0;
        add(sta[top], sz), bel[sta[top]] = sz, insta[sta[top--]] = 0;
      }
    } else
      low[u] = min(low[u], dfn[v]);
  }
}
int vis[1000005], fa[1000005][22], q;
void dfss(int u) {
  for (int i = 0; i < g[u].size(); i++) {
    int v = g[u][i];
    if (v == fa[u][0]) continue;
    dep[v] = dep[u] + 1;
    fa[v][0] = u;
    dfss(v);
  }
}
int LCA(int x, int y) {
  if (dep[x] < dep[y]) swap(x, y);
  for (int i = 19; i >= 0; i--)
    if (dep[fa[x][i]] >= dep[y]) x = fa[x][i];
  if (x == y) return x;
  for (int i = 19; i >= 0; i--)
    if (fa[x][i] != fa[y][i]) x = fa[x][i], y = fa[y][i];
  return fa[x][0];
}
int main() {
  init();
  scanf("%d%d%d", &n, &m, &q);
  sz = n;
  for (int i = 1; i <= m; i++) {
    int u, v;
    scanf("%d%d", &u, &v);
    insert(u, v);
    insert(v, u);
  }
  for (int i = 1; i <= n; i++)
    if (!dfn[i]) dfs(i), dfss(i);
  for (int j = 1; j <= 19; j++)
    for (int i = 1; i <= sz; i++) fa[i][j] = fa[fa[i][j - 1]][j - 1];
  while (q--) {
    int x, y;
    scanf("%d%d", &x, &y);
    int lca = LCA(x, y);
    printf("%d\n", (dep[x] + dep[y] - 2 * dep[lca]) >> 1);
  }
  return 0;
}
