#include <bits/stdc++.h>
using namespace std;
vector<int> E[301000], T[301000], G[301000];
int n, m, q, Time[301000], Up[301000], cnt, clique[301000], parent_G[301000];
int parent[301000][20], Depth[301000];
void DFS(int a, int pp) {
  Time[a] = ++cnt;
  parent_G[a] = pp;
  int r = Time[a];
  for (auto &v : E[a]) {
    if (Time[v]) {
      r = min(r, Time[v]);
      continue;
    }
    T[a].push_back(v);
    DFS(v, a);
    if (Up[v] >= Time[a]) clique[v] = 1;
    r = min(r, Up[v]);
  }
  Up[a] = r;
}
void AddEdge(int a, int b) {
  G[a].push_back(b);
  G[b].push_back(a);
}
void Find_Depth(int a, int pp) {
  parent[a][0] = pp;
  for (int i = 0; i < 19; i++) parent[a][i + 1] = parent[parent[a][i]][i];
  for (auto &v : G[a]) {
    if (v != pp) {
      Depth[v] = Depth[a] + 1;
      Find_Depth(v, a);
    }
  }
}
int LCA(int a, int b) {
  if (Depth[a] < Depth[b]) return LCA(b, a);
  int d = Depth[a] - Depth[b], i = 0;
  while (d) {
    if (d & 1) a = parent[a][i];
    d >>= 1;
    i++;
  }
  for (i = 18; i >= 0; i--)
    if (parent[a][i] != parent[b][i]) a = parent[a][i], b = parent[b][i];
  if (a != b) a = parent[a][0];
  return a;
}
void Build_Tree(int a, int c) {
  if (c) AddEdge(n + c, a);
  for (auto &x : T[a]) {
    if (clique[x]) {
      cnt++;
      AddEdge(n + cnt, a);
      Build_Tree(x, cnt);
    } else
      Build_Tree(x, c);
  }
}
int main() {
  int i, u, v;
  scanf("%d%d%d", &n, &m, &q);
  for (i = 0; i < m; i++) {
    scanf("%d%d", &u, &v);
    E[u].push_back(v);
    E[v].push_back(u);
  }
  DFS(1, 0);
  cnt = 0;
  Build_Tree(1, 0);
  Find_Depth(1, 0);
  int a, b;
  while (q--) {
    scanf("%d%d", &a, &b);
    printf("%d\n", (Depth[a] + Depth[b] - Depth[LCA(a, b)] * 2) / 2);
  }
}
