#include <bits/stdc++.h>
using namespace std;
const int N = 2 * 1e5 + 10;
const int M = 5 * 1e5 + 10;
int n;
int m;
int q;
namespace Tre {
int v[2 * N];
int x[2 * N];
int ct;
int al[N];
int dep[N];
int fa[N][22];
int cnt[N];
inline void add(int u, int V) {
  v[++ct] = V;
  x[ct] = al[u];
  al[u] = ct;
}
inline void dfs(int u) {
  cnt[u] = (u > n) + cnt[fa[u][0]];
  dep[u] = dep[fa[u][0]] + 1;
  for (int i = 0; fa[u][i]; i++) fa[u][i + 1] = fa[fa[u][i]][i];
  for (int i = al[u]; i; i = x[i])
    if (v[i] != fa[u][0]) fa[v[i]][0] = u, dfs(v[i]);
}
inline int lca(int u, int v) {
  if (dep[u] < dep[v]) swap(u, v);
  for (int d = dep[u] - dep[v], i = 0; d; d >>= 1, i++)
    if (d & 1) u = fa[u][i];
  if (u == v) return u;
  for (int i = 18; i >= 0; i--)
    if (fa[u][i] != fa[v][i]) u = fa[u][i], v = fa[v][i];
  return fa[u][0];
}
inline void qry(int u, int v) {
  int lc = lca(u, v);
  printf("%d\n", cnt[u] + cnt[v] - cnt[lc] - cnt[fa[lc][0]]);
}
}  // namespace Tre
namespace Grph {
int v[2 * M];
int x[2 * M];
int ct;
int al[N];
int ctt;
int dfn[N];
int low[N];
int st[N];
int tp;
int df;
inline void add(int u, int V) {
  v[++ct] = V;
  x[ct] = al[u];
  al[u] = ct;
}
inline int tarjan(int u) {
  dfn[u] = low[u] = ++df;
  st[++tp] = u;
  for (int i = al[u]; i; i = x[i])
    if (dfn[v[i]] == 0) {
      low[u] = min(low[u], tarjan(v[i]));
      if (low[v[i]] >= dfn[u]) {
        ++ctt;
        for (; st[tp + 1] != v[i]; tp--)
          Tre::add(st[tp], ctt), Tre::add(ctt, st[tp]);
        Tre::add(u, ctt);
        Tre::add(ctt, u);
      }
    } else
      low[u] = min(low[u], dfn[v[i]]);
  return low[u];
}
}  // namespace Grph
int main() {
  scanf("%d%d%d", &n, &m, &q);
  Grph::ctt = n;
  for (int i = 1, u, v; i <= m; i++)
    scanf("%d%d", &u, &v), Grph::add(u, v), Grph::add(v, u);
  Grph::tarjan(1);
  Tre::dfs(1);
  for (int i = 1, u, v; i <= q; i++) scanf("%d%d", &u, &v), Tre::qry(u, v);
  return 0;
}
