#include <bits/stdc++.h>
using namespace std;
const long long INF = (long long)1e18;
const int mod = (int)1e9 + 7;
const int MAXN = (int)1e5 + 5;
long long n, m, q;
vector<int> adj[MAXN];
vector<int> adj2[2 * MAXN];
const int L = 18;
int tin[MAXN];
int dep[MAXN];
int name[MAXN];
int f[MAXN];
int tme = 1;
int ot;
int tot = 0;
void dfs(int v) {
  tin[v] = tme++;
  for (int j : adj[v]) {
    if (tin[j] == 0) {
      dep[j] = dep[v] + 1;
      dfs(j);
    }
  }
}
unordered_map<int, bool> mp;
void dfs2(int v) {
  f[v] = -1;
  for (int j : adj[v]) {
    if (dep[j] == dep[v] + 1) {
      dfs2(j);
    }
  }
  mp.clear();
  for (int j : adj[v]) {
    if (dep[j] != dep[v] + 1) {
      if (f[j] != -1) {
        assert(name[j] != 0);
        adj2[name[j]].push_back(v);
        adj2[v].push_back(name[j]);
        tot += 2;
        assert(tot <= 4 * n);
        mp[f[j]] = 1;
        f[j] = v;
      }
    }
  }
  for (int j : adj[v]) {
    if (dep[j] == dep[v] + 1 && mp[j] == 0) {
      f[j] = v;
      name[j] = ot++;
      assert(ot <= 2 * n);
      adj2[name[j]].push_back(v);
      adj2[v].push_back(name[j]);
      adj2[name[j]].push_back(j);
      adj2[j].push_back(name[j]);
      tot += 4;
      assert(tot <= 4 * n);
    }
  }
}
int dep2[2 * MAXN];
int par[2 * MAXN][L];
void dfs3(int v, int pr) {
  dep2[v] = dep2[pr] + 1;
  par[v][0] = pr;
  for (int j = 1; j < L; j++) {
    par[v][j] = par[par[v][j - 1]][j - 1];
  }
  for (int j : adj2[v]) {
    if (j != pr) dfs3(j, v);
  }
}
int lca(int a, int b) {
  if (dep2[b] < dep2[a]) return lca(b, a);
  for (int j = L - 1; j >= 0; j--) {
    if (dep2[a] <= dep2[b] - (1 << j)) b = par[b][j];
  }
  if (a == b) return a;
  for (int j = L - 1; j >= 0; j--)
    if (par[a][j] != par[b][j]) {
      a = par[a][j];
      b = par[b][j];
    }
  return par[a][0];
}
int clc(int a, int b) { return dep2[a] + dep2[b] - 2 * dep2[lca(a, b)]; }
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(nullptr);
  cout.tie(nullptr);
  cin >> n >> m >> q;
  ot = n + 1;
  for (int i = 0; i < m; i++) {
    int a, b;
    cin >> a >> b;
    adj[a].push_back(b);
    adj[b].push_back(a);
  }
  cerr << "k1" << '\n';
  dfs(1);
  cerr << "k2" << '\n';
  for (int i = 1; i <= n; i++) {
    for (int j = 0; j < adj[i].size(); j++) {
      int c = adj[i][j];
      if (tin[c] < tin[i]) {
        swap(adj[i].back(), adj[i][j]);
        j--;
        adj[i].pop_back();
      }
    }
  }
  cerr << "k3" << '\n';
  dfs2(1);
  cerr << "k4" << '\n';
  dfs3(1, 1);
  cerr << "k5" << '\n';
  for (int i = 0; i < q; i++) {
    int a, b;
    cin >> a >> b;
    assert(clc(a, b) % 2 == 0);
    cout << clc(a, b) / 2 << '\n' << flush;
  }
}
