#include <bits/stdc++.h>
using namespace std;
inline char gc() {
  static char buf[100000], *p1 = buf, *p2 = buf;
  return p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 100000, stdin), p1 == p2)
             ? EOF
             : *p1++;
}
inline int read() {
  int x = 0;
  char ch = getchar();
  bool positive = 1;
  for (; !isdigit(ch); ch = getchar())
    if (ch == '-') positive = 0;
  for (; isdigit(ch); ch = getchar()) x = x * 10 + ch - '0';
  return positive ? x : -x;
}
struct node {
  int to, next;
} e[1000050], E[1000050];
int cnt, CNT;
int n, m, q;
int p[200020][30], low[500050], dfn[500050], insta[500050], d[500050];
int head[500050], HEAD[500050];
void add(int u, int v) {
  ++cnt;
  e[cnt].to = v;
  e[cnt].next = head[u];
  head[u] = cnt;
}
void ADD(int u, int v) {
  ++CNT;
  E[CNT].to = v;
  E[CNT].next = HEAD[u];
  HEAD[u] = CNT;
}
int tot, gs;
stack<int> s;
void tarjan(int x, int fa) {
  low[x] = dfn[x] = ++tot;
  s.push(x);
  insta[x] = 1;
  for (int i = head[x]; i; i = e[i].next) {
    int v = e[i].to;
    if (v == fa) continue;
    if (!dfn[v]) {
      tarjan(v, x);
      low[x] = min(low[x], low[v]);
      if (low[v] >= dfn[x]) {
        int k;
        gs++;
        while (s.top() != v) {
          k = s.top();
          s.pop();
          insta[k] = false;
          ADD(k, n + gs);
          ADD(n + gs, k);
        }
        ADD(v, n + gs);
        ADD(n + gs, v);
        insta[v] = false;
        s.pop();
        ADD(x, n + gs);
        ADD(n + gs, x);
      }
    } else if (insta[v])
      low[x] = min(low[x], dfn[v]);
  }
}
void dfs(int u, int fa) {
  d[u] = d[fa] + 1;
  p[u][0] = fa;
  for (int i = 1; (1 << i) <= d[u]; i++) p[u][i] = p[p[u][i - 1]][i - 1];
  for (int i = HEAD[u]; i; i = E[i].next) {
    int v = E[i].to;
    if (v != fa) dfs(v, u);
  }
}
int lca(int a, int b) {
  if (d[a] > d[b]) swap(a, b);
  for (int i = 20; i >= 0; i--)
    if (d[a] <= d[b] - (1 << i)) b = p[b][i];
  if (a == b) return a;
  for (int i = 20; i >= 0; i--) {
    if (p[a][i] == p[b][i])
      continue;
    else
      a = p[a][i], b = p[b][i];
  }
  return p[a][0];
}
int main() {
  n = read();
  m = read();
  q = read();
  for (int i = 1; i <= m; i++) {
    int x, y;
    x = read();
    y = read();
    add(x, y);
    add(y, x);
  }
  tarjan(1, 1);
  dfs(1, 1);
  while (q--) {
    int x, y;
    x = read();
    y = read();
    int lc = lca(x, y);
    cout << (d[x] + d[y] - 2 * d[lc]) / 2 << endl;
  }
}
