#include <bits/stdc++.h>
using namespace std;
int dfn[200002], low[200002], tot, head[200002], num, f[200002];
int p[20][200002];
int deep[200002], n, m, q, st[200002], top, dep[200002];
bool vis[200002];
inline long long rd() {
  long long x = 0;
  char c = getchar();
  bool f = 0;
  while (!isdigit(c)) {
    if (c == '-') f = 1;
    c = getchar();
  }
  while (isdigit(c)) {
    x = (x << 1) + (x << 3) + (c ^ 48);
    c = getchar();
  }
  return f ? -x : x;
}
struct edge {
  int n, to;
} e[200002];
inline void add(int u, int v) {
  e[++tot].n = head[u];
  e[tot].to = v;
  head[u] = tot;
}
vector<int> vec[200002];
void tarjan(int u, int fa) {
  dfn[u] = low[u] = ++dfn[0];
  st[++top] = u;
  vis[u] = 1;
  for (vector<int>::iterator it = vec[u].begin(); it != vec[u].end(); ++it) {
    int v = *it;
    if (v == fa) continue;
    if (!dfn[v]) {
      tarjan(v, u);
      low[u] = min(low[u], low[v]);
      if (low[v] == dfn[u]) {
        ++num;
        add(u, num);
        int x = 0;
        while (x != v) {
          x = st[top];
          add(num, x);
          vis[x] = 0;
          top--;
        }
      }
      if (low[v] > dfn[u]) {
        add(u, v);
        vis[st[top]] = 0;
        top--;
      }
    } else if (vis[v])
      low[u] = min(low[u], dfn[v]);
  }
}
void dfs(int u, int fa) {
  for (int i = 1; (1 << i) <= deep[u]; ++i) p[i][u] = p[i - 1][p[i - 1][u]];
  for (int i = head[u]; i; i = e[i].n)
    if (e[i].to != fa) {
      int v = e[i].to;
      f[v] = u;
      deep[v] = deep[u] + 1;
      p[0][v] = u;
      dep[v] = dep[u] + (v > n);
      dfs(v, u);
    }
}
inline int getlca(int u, int v) {
  if (deep[u] < deep[v]) swap(u, v);
  for (int i = 19; i >= 0; --i)
    if (deep[u] - (1 << i) >= deep[v]) u = p[i][u];
  if (u == v) return u;
  for (int i = 19; i >= 0; --i)
    if (p[i][u] != p[i][v]) u = p[i][u], v = p[i][v];
  return p[0][u];
}
inline int dist(int u, int v) {
  int lca = getlca(u, v);
  return deep[u] + deep[v] - 2 * deep[lca] -
         (dep[u] + dep[v] - dep[lca] - dep[f[lca]]);
}
int main() {
  n = rd();
  m = rd();
  q = rd();
  int u, v;
  for (int i = 1; i <= m; ++i) {
    u = rd();
    v = rd();
    vec[u].push_back(v);
    vec[v].push_back(u);
  }
  num = n;
  tarjan(1, 0);
  dfs(1, 0);
  while (q--) {
    u = rd();
    v = rd();
    printf("%d\n", dist(u, v));
  }
  return 0;
}
