#include <bits/stdc++.h>
using namespace std;
const int maxm = 500005;
const int maxn = 200005;
int n, m, Q;
struct Edge {
  int to, nxt;
} e[maxn << 1];
int first[maxn];
int cnt;
inline void add_edge(int from, int to) {
  e[++cnt].nxt = first[from];
  first[from] = cnt;
  e[cnt].to = to;
  e[++cnt].nxt = first[to];
  first[to] = cnt;
  e[cnt].to = from;
}
bool fd[maxn];
namespace Tj {
static const int MAXN = 100005;
struct Edge {
  int to, nxt;
} e[maxm << 1];
int first[maxn];
inline void add_edge(int from, int to) {
  static int cnt = 0;
  e[++cnt].nxt = first[from];
  first[from] = cnt;
  e[cnt].to = to;
  e[++cnt].nxt = first[to];
  first[to] = cnt;
  e[cnt].to = from;
}
bool is_cut[maxn];
int dfn[maxn];
int low[maxn];
stack<int> sta;
inline void dfs(int now) {
  static int clo = 0;
  dfn[now] = low[now] = ++clo;
  sta.push(now);
  int flag = 0;
  for (int i = first[now]; i; i = e[i].nxt) {
    int to = e[i].to;
    if (!dfn[to]) {
      flag++;
      dfs(to);
      low[now] = min(low[to], low[now]);
      if (dfn[now] <= low[to]) {
        is_cut[now] = true;
        n++;
        fd[n] = true;
        int noww;
        do {
          noww = sta.top();
          sta.pop();
          ::add_edge(noww, n);
        } while (!sta.empty() && noww != to);
        ::add_edge(now, n);
      }
    } else if (dfn[to] < dfn[now])
      low[now] = min(low[now], dfn[to]);
  }
}
inline void pre() {
  memset(dfn, 0, sizeof(dfn));
  memset(is_cut, 0, sizeof(is_cut));
  memset(fd, 0, sizeof(fd));
  dfs(1);
}
}  // namespace Tj
int fa[maxn];
int dep[maxn];
int dep2[maxn];
int siz[maxn];
int son[maxn];
inline void dfs1(int now) {
  siz[now] = 1;
  for (int i = first[now]; i; i = e[i].nxt) {
    int to = e[i].to;
    if (to != fa[now]) {
      fa[to] = now;
      dep2[to] = dep2[now] + 1;
      dep[to] = dep[now] + !fd[to];
      dfs1(to);
      siz[now] += siz[to];
      if (!son[now] || siz[to] > siz[son[now]]) son[now] = to;
    }
  }
}
int ffa[maxn];
inline void dfs2(int now) {
  if (son[now]) {
    ffa[son[now]] = ffa[now];
    dfs2(son[now]);
  }
  for (int i = first[now]; i; i = e[i].nxt) {
    int to = e[i].to;
    if (to != fa[now] && to != son[now]) {
      ffa[to] = to;
      dfs2(to);
    }
  }
}
inline void pre() {
  fa[1] = ffa[1] = 1;
  dep[1] = 1;
  dfs1(1);
  dfs2(1);
}
inline int lca(int a, int b) {
  while (ffa[a] != ffa[b]) {
    if (dep2[ffa[a]] > dep2[ffa[b]])
      a = fa[ffa[a]];
    else
      b = fa[ffa[b]];
  }
  return dep2[a] > dep2[b] ? b : a;
}
int main() {
  scanf("%d%d%d", &n, &m, &Q);
  for (int i = 1, f, t; i <= m; ++i) {
    scanf("%d%d", &f, &t);
    Tj::add_edge(f, t);
  }
  Tj::pre();
  pre();
  while (Q--) {
    int s, t;
    scanf("%d%d", &s, &t);
    int Lca = lca(s, t);
    printf("%d\n", dep[s] + dep[t] - 2 * dep[Lca] - fd[Lca]);
  }
  return 0;
}
