#include <bits/stdc++.h>
using namespace std;
const int maxn = 400010;
const int mod = 1e9 + 7;
const int MAX = 1000000010;
const double eps = 1e-6;
const double PI = acos(-1);
template <typename T>
inline void read(T &x) {
  x = 0;
  T f = 1;
  char ch;
  do {
    ch = getchar();
    if (ch == '-') f = -1;
  } while (ch < '0' || ch > '9');
  do x = x * 10 + ch - '0', ch = getchar();
  while (ch <= '9' && ch >= '0');
  x *= f;
}
template <typename A, typename B>
inline void read(A &x, B &y) {
  read(x);
  read(y);
}
template <typename A, typename B, typename C>
inline void read(A &x, B &y, C &z) {
  read(x);
  read(y);
  read(z);
}
template <typename A, typename B, typename C, typename D>
inline void read(A &x, B &y, C &z, D &w) {
  read(x);
  read(y);
  read(z);
  read(w);
}
template <typename A, typename B>
inline A fexp(A x, B p) {
  A ans = 1;
  for (; p; p >>= 1, x = 1LL * x * x % mod)
    if (p & 1) ans = 1LL * ans * x % mod;
  return ans;
}
template <typename A, typename B>
inline A fexp(A x, B p, A mo) {
  A ans = 1;
  for (; p; p >>= 1, x = 1LL * x * x % mo)
    if (p & 1) ans = 1LL * ans * x % mo;
  return ans;
}
int n, m, q;
vector<int> G[maxn], W[maxn];
map<pair<int, int>, int> ban;
int low[maxn], dfn[maxn], S[maxn], tot, top;
int cnt;
vector<int> bcc[maxn];
int size[maxn], fa[maxn], son[maxn], len[maxn], an[maxn], dep[maxn];
int U[500010], V[500010];
void dfs(int u, int f) {
  low[u] = dfn[u] = ++tot;
  for (auto v : G[u])
    if (v != f) {
      if (!dfn[v]) {
        S[++top] = v;
        dfs(v, u);
        if (low[v] >= dfn[u]) {
          cnt++;
          do {
            bcc[cnt].push_back(S[top]);
          } while (S[top--] != v);
          bcc[cnt].push_back(u);
        }
        if (low[v] < low[u]) low[u] = low[v];
      }
      if (dfn[v] < low[u]) low[u] = dfn[v];
    }
}
void dfs1(int u) {
  size[u] = 1;
  int now = -1;
  for (auto v : G[u]) {
    now++;
    if (v != fa[u]) {
      fa[v] = u;
      dep[v] = dep[u] + 1;
      len[v] = len[u] + W[u][now];
      dfs1(v);
      size[u] += size[v];
    }
  }
  if (size[u] > size[son[fa[u]]]) son[fa[u]] = u;
}
void dfs2(int u, int anc) {
  an[u] = anc;
  if (son[u]) dfs2(son[u], anc);
  for (auto v : G[u])
    if (v != son[u] && v != fa[u]) dfs2(v, v);
}
int lca(int u, int v) {
  while (an[u] != an[v]) {
    if (dep[an[u]] > dep[an[v]])
      u = fa[an[u]];
    else
      v = fa[an[v]];
  }
  return dep[u] < dep[v] ? u : v;
}
void find_bcc() {
  dfs(1, 0);
  for (int i = (1); i <= (cnt); i++)
    for (auto x : bcc[i])
      for (auto y : bcc[i]) ban[make_pair(x, y)] = 1;
  for (int i = (1); i <= (n); i++) G[i].clear();
  for (int i = (1); i <= (m); i++) {
    int u, v;
    u = U[i], v = V[i];
    if (ban[make_pair(u, v)]) continue;
    G[u].push_back(v);
    W[u].push_back(2);
    G[v].push_back(u);
    W[v].push_back(2);
    ban[make_pair(u, v)] = ban[make_pair(v, u)] = 1;
  }
  for (int i = (1); i <= (cnt); i++) {
    for (auto x : bcc[i]) {
      int u = n + i, v = x;
      G[u].push_back(v);
      W[u].push_back(1);
      G[v].push_back(u);
      W[v].push_back(1);
    }
  }
}
void Work() {
  find_bcc();
  dfs1(1);
  dfs2(1, 1);
  while (q--) {
    int u, v;
    read(u, v);
    int p = lca(u, v);
    int ans = len[u] + len[v] - len[p] - len[p];
    ans >>= 1;
    printf("%d\n", ans);
  }
}
void Init() {
  read(n, m, q);
  for (int i = (1); i <= (m); i++) {
    int u, v;
    read(u, v);
    G[u].push_back(v);
    G[v].push_back(u);
    U[i] = u;
    V[i] = v;
  }
}
int main() {
  Init();
  Work();
  return 0;
}
