#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 15;
int dfn[N];
int piv = 1;
int par[N];
int low[N];
bool vis[N];
vector<int> graph[N], bcc[N];
void dfs(int x, int p) {
  dfn[x] = low[x] = ++piv;
  par[x] = p;
  for (int i = 0; i < graph[x].size(); i++) {
    int w = graph[x][i];
    if (w == p) continue;
    if (!dfn[w]) {
      dfs(w, x);
      low[x] = min(low[x], low[w]);
    } else {
      low[x] = min(low[x], dfn[w]);
    }
  }
}
int cpiv = 0;
void color(int x, int c) {
  if (c > 0) bcc[x].push_back(c);
  vis[x] = 1;
  for (int i = 0; i < graph[x].size(); i++) {
    int w = graph[x][i];
    if (vis[w]) continue;
    if (dfn[x] <= low[w]) {
      bcc[x].push_back(++cpiv);
      color(w, cpiv);
    } else {
      color(w, c);
    }
  }
}
const int M = 20;
vector<int> adj[N];
int lca[N][M];
int weight[N][M], sum[N], depth[N];
map<vector<int>, int> Hash;
void treeDfs(int root, int par) {
  lca[root][0] = par;
  weight[root][0] = sum[root];
  depth[root] = depth[par] + 1;
  for (int i = 1; i < M; ++i) {
    lca[root][i] = lca[lca[root][i - 1]][i - 1];
    weight[root][i] = weight[root][i - 1] + weight[lca[root][i - 1]][i - 1];
  }
  for (int v : adj[root]) {
    if (v != par) {
      treeDfs(v, root);
    }
  }
}
int query(int a, int b) {
  if (depth[a] < depth[b]) {
    swap(a, b);
  }
  int d = depth[a] - depth[b];
  int ret = 0;
  for (int i = 0; i < M; ++i) {
    if (d & (1 << i)) {
      ret += weight[a][i];
      a = lca[a][i];
    }
  }
  if (a != b) {
    for (int i = M - 1; i >= 0; --i) {
      if (lca[a][i] != lca[b][i]) {
        ret += weight[a][i];
        ret += weight[b][i];
        a = lca[a][i];
        b = lca[b][i];
      }
    }
    ret += weight[a][0];
    ret += weight[b][0];
    b = lca[b][0];
    ret += sum[b];
  } else {
    ret += sum[b];
  }
  return ret;
}
int vertexId[N];
int main() {
  int n, m, q;
  scanf("%d%d%d", &n, &m, &q);
  for (int i = 0; i < m; ++i) {
    int a, b;
    scanf("%d%d", &a, &b);
    graph[a].push_back(b);
    graph[b].push_back(a);
  }
  dfs(1, 0);
  color(1, 0);
  int vertex = 1;
  for (int i = 1; i <= cpiv; ++i) {
    vector<int> tmp;
    tmp.push_back(i);
    Hash[tmp] = vertex++;
    sum[vertex - 1] = 1;
  }
  for (int i = 1; i <= n; ++i) {
    if (Hash.count(bcc[i])) {
      vertexId[i] = Hash[bcc[i]];
      continue;
    }
    vertexId[i] = vertex;
    Hash[bcc[i]] = vertex++;
    int id1 = vertex - 1;
    for (int x : bcc[i]) {
      vector<int> tmp;
      tmp.push_back(x);
      int id = Hash[tmp];
      adj[id1].push_back(id);
      adj[id].push_back(id1);
    }
  }
  for (int i = 1; i <= n; ++i) {
    if (depth[i] == 0) {
      treeDfs(i, 0);
    }
  }
  for (int i = 0; i < q; ++i) {
    int a, b;
    scanf("%d%d", &a, &b);
    int x = a, y = b;
    a = vertexId[a];
    b = vertexId[b];
    printf("%d\n", query(a, b));
  }
}
