#include <bits/stdc++.h>
using namespace std;
int in[100007], n, m, q, num[100007], low[100007], level[200007];
int u, v, cnt = 0, cur, p[19][200007];
vector<int> edge[100007], ed[200007];
stack<int> st;
void dfs(int u, int par) {
  num[u] = low[u] = ++cnt;
  st.push(u);
  for (int v : edge[u]) {
    if (v == par) continue;
    if (num[v]) {
      low[u] = min(low[u], num[v]);
    } else {
      dfs(v, u);
      low[u] = min(low[u], low[v]);
      if (low[v] >= num[u]) {
        int vt = u;
        cur++;
        ed[cur].push_back(vt);
        ed[vt].push_back(cur);
        while (vt != v) {
          vt = st.top(), st.pop();
          ed[cur].push_back(vt), ed[vt].push_back(cur);
        }
      }
    }
  }
}
void redfs(int u, int par) {
  for (int v : ed[u]) {
    if (v == par) continue;
    p[0][v] = u;
    level[v] = level[u] + 1;
    redfs(v, u);
  }
}
int lca(int u, int v) {
  if (level[u] > level[v]) swap(u, v);
  for (int i = 18; i >= 0; i--)
    if (level[u] <= level[p[i][v]]) v = p[i][v];
  for (int i = 18; i >= 0; i--) {
    if (p[i][u] != p[i][v]) {
      u = p[i][u];
      v = p[i][v];
    }
  }
  if (u == v) return u;
  return p[0][u];
}
int cal(int u, int v) {
  int lc = lca(u, v);
  return (level[u] + level[v] - 2 * level[lc]) / 2;
}
int main() {
  ios_base::sync_with_stdio(0);
  cin >> n >> m >> q;
  for (int i = 1; i <= m; i++) {
    cin >> u >> v;
    edge[u].push_back(v);
    edge[v].push_back(u);
  }
  cur = n;
  dfs(1, 1);
  level[1] = 1;
  p[0][1] = 1;
  redfs(1, 1);
  for (int i = 1; i <= 18; i++) {
    for (int j = 1; j <= cur; j++) {
      p[i][j] = p[i - 1][p[i - 1][j]];
    }
  }
  while (q--) {
    cin >> u >> v;
    cout << cal(u, v) << "\n";
  }
}
