#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1e5 + 10, LOGN = 20;
struct bridge {
  struct edge {
    int u, v, comp;
    bool bridge;
  };
  int n;
  vector<int> adj[MAXN];
  vector<edge> e;
  bridge(int n = 0) : n(n) {
    e.clear();
    initDfs();
  }
  void initDfs() {
    nbc = t = 0;
    for (int u = int(0); u < int(n); u++) d[u] = -1;
  }
  void addEdge(int u, int v) {
    adj[u].emplace_back(int((e).size()));
    adj[v].emplace_back(int((e).size()));
    e.emplace_back((edge){u, v, -1, false});
  }
  int d[MAXN], b[MAXN], t, nbc;
  bool art[MAXN];
  int comp[MAXN];
  stack<int> st;
  void dfs(int u = 0, int pe = -1) {
    b[u] = d[u] = t++;
    comp[u] = (pe != -1);
    for (int i = int(0); i < int(int((adj[u]).size())); i++) {
      int ne = adj[u][i];
      if (ne == pe) continue;
      int v = e[ne].u ^ e[ne].v ^ u;
      if (d[v] == -1) {
        st.push(ne);
        dfs(v, ne);
        if (b[v] > d[u]) e[ne].bridge = true;
        if (b[v] >= d[u]) {
          int last;
          do {
            last = st.top();
            st.pop();
            e[last].comp = nbc;
          } while (last != ne);
          nbc++;
          art[u] = true;
          comp[u]++;
        }
        b[u] = min(b[u], b[v]);
      } else if (d[v] < d[u]) {
        st.push(ne);
        b[u] = min(b[u], d[v]);
      }
    }
  }
};
vector<int> adj[2 * MAXN];
int f[2 * MAXN][LOGN], L[2 * MAXN];
void dfs(int u = 0, int p = -1, int l = 0) {
  f[u][0] = p, L[u] = l;
  for (int v : adj[u])
    if (v != p) dfs(v, u, l + 1);
}
void build() {
  for (int k = int(0); k < int(LOGN - 1); k++)
    for (int i = int(0); i < int(MAXN); i++)
      if (f[i][k] != -1) f[i][k + 1] = f[f[i][k]][k];
}
int climb(int a, int d) {
  if (!d) return a;
  for (int i = int((31 - __builtin_clz(L[a])) + 1 - 1); i >= int(0); i--)
    if (1 << i <= d) a = f[a][i], d -= 1 << i;
  return a;
}
int lca(int a, int b) {
  if (L[a] < L[b]) swap(a, b);
  a = climb(a, L[a] - L[b]);
  if (a == b) return a;
  for (int i = int((31 - __builtin_clz(L[a])) + 1 - 1); i >= int(0); i--)
    if (f[a][i] != f[b][i]) a = f[a][i], b = f[b][i];
  return f[a][0];
}
int dist(int a, int b) { return L[a] + L[b] - 2 * L[lca(a, b)]; }
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  int n, m, q;
  cin >> n >> m >> q;
  bridge b(n);
  while (m--) {
    int u, v;
    cin >> u >> v;
    u--, v--;
    b.addEdge(u, v);
  }
  b.dfs();
  for (int u = int(0); u < int(n); u++) {
    vector<int> comps;
    for (int ne : b.adj[u]) {
      auto &e = b.e[ne];
      comps.emplace_back(e.comp);
    }
    sort(comps.begin(), comps.end());
    comps.erase(unique(comps.begin(), comps.end()), comps.end());
    for (int c : comps) {
      adj[u].emplace_back(n + c), adj[n + c].emplace_back(u);
    }
  }
  dfs();
  build();
  while (q--) {
    int u, v;
    cin >> u >> v;
    u--, v--;
    cout << dist(u, v) / 2 << '\n';
  }
  return 0;
}
