#include <bits/stdc++.h>
using namespace std;
int N, M, Q;
int head[500007], to[1000007], nxt[1000007], cap;
int head2[500007 * 2], to2[1000007 * 2], nxt2[1000007 * 2], cap2;
int pre[500007], bccno[500007], dfn, cnt;
int dep[500007 * 2], mx[500007 * 2], sz[500007 * 2], fa[500007 * 2],
    top[500007 * 2];
int dis[500007 * 2];
vector<int> bcc[500007];
struct edge {
  int u, v;
};
stack<edge> s;
inline int read() {
  int x = 0;
  char c = getchar();
  while (c < '0' || '9' < c) c = getchar();
  while ('0' <= c && c <= '9') x = x * 10 + c - '0', c = getchar();
  return x;
}
inline void print(int x) {
  if (x >= 10) print(x / 10);
  putchar(x % 10 + '0');
}
void addEdge(int u, int v) {
  nxt[++cap] = head[u];
  head[u] = cap;
  to[cap] = v;
}
void addEdge2(int u, int v) {
  nxt2[++cap2] = head2[u];
  head2[u] = cap2;
  to2[cap2] = v;
}
int dfs(int u, int fa) {
  int lowu = pre[u] = ++dfn;
  for (int i = head[u]; i; i = nxt[i]) {
    if (!pre[to[i]]) {
      s.push((edge){u, to[i]});
      int lowv = dfs(to[i], u);
      lowu = min(lowu, lowv);
      if (lowv >= pre[u]) {
        cnt++;
        bcc[cnt].clear();
        while (1) {
          edge x = s.top();
          s.pop();
          if (bccno[x.u] != cnt) {
            bcc[cnt].push_back(x.u);
            bccno[x.u] = cnt;
          }
          if (bccno[x.v] != cnt) {
            bcc[cnt].push_back(x.v);
            bccno[x.v] = cnt;
          }
          if (x.u == u && x.v == to[i]) break;
        }
      }
    } else if (pre[to[i]] < pre[u] && to[i] != fa) {
      s.push((edge){u, to[i]});
      lowu = min(lowu, pre[to[i]]);
    }
  }
  return lowu;
}
void find_bcc() {
  for (int i = 1; i <= N; ++i)
    if (!pre[i]) dfs(i, -1);
}
void dfs2(int x, int ft, int w) {
  if (x > N) w++;
  dis[x] = w;
  for (int i = head2[x]; i; i = nxt2[i])
    if (to2[i] != ft) dfs2(to2[i], x, w);
}
void search1(int x) {
  sz[x] = 1;
  for (int i = head2[x]; i; i = nxt2[i])
    if (to2[i] != fa[x]) {
      fa[to2[i]] = x;
      dep[to2[i]] = dep[x] + 1;
      search1(to2[i]);
      sz[x] += sz[to2[i]];
    }
}
void search2(int x, int tp) {
  top[x] = tp;
  int k = 0;
  for (int i = head2[x]; i; i = nxt2[i])
    if (to2[i] != fa[x] && sz[to2[i]] > sz[k]) k = to2[i];
  if (k == 0) return;
  search2(k, tp);
  for (int i = head2[x]; i; i = nxt2[i])
    if (to2[i] != fa[x] && to2[i] != k) search2(to2[i], to2[i]);
}
inline int get_lca(int u, int v) {
  while (top[u] != top[v]) {
    if (dep[top[u]] > dep[top[v]])
      u = fa[top[u]];
    else
      v = fa[top[v]];
  }
  return dep[u] > dep[v] ? v : u;
}
int main() {
  N = read(), M = read(), Q = read();
  int u, v;
  for (int i = 1; i <= M; ++i) {
    u = read(), v = read();
    addEdge(u, v);
    addEdge(v, u);
  }
  find_bcc();
  for (int i = 1; i <= cnt; ++i) {
    for (int j = 0; j < bcc[i].size(); ++j) {
      addEdge2(bcc[i][j], i + N);
      addEdge2(i + N, bcc[i][j]);
    }
  }
  search1(1);
  search2(1, 1);
  dfs2(1, 0, 0);
  int lca, res;
  for (int i = 1; i <= Q; ++i) {
    u = read(), v = read();
    lca = get_lca(u, v);
    res = dis[u] + dis[v] - dis[lca] * 2;
    if (lca > N) res++;
    print(res);
    puts("");
  }
  return 0;
}
