#include <bits/stdc++.h>
using namespace std;
const int maxn = 100005;
int V, E;
int i, j;
int a, b;
int size;
int gtime;
stack<pair<int, int> > Q;
int disc[maxn];
int back[maxn];
bool mark[5 * maxn];
vector<pair<int, int> > bic[5 * maxn];
vector<pair<int, int> > graph[maxn];
void dfs(int v) {
  gtime++;
  disc[v] = gtime;
  back[v] = gtime;
  for (int k = graph[v].size() - 1; k >= 0; k--) {
    int next = graph[v][k].first;
    int edge = graph[v][k].second;
    if (!mark[edge]) {
      Q.push(pair<int, int>(v, next));
      mark[edge] = true;
    }
    if (!disc[next]) {
      dfs(next);
      back[v] = min(back[v], back[next]);
      if (back[next] >= disc[v]) {
        size++;
        for (;;) {
          pair<int, int> x = Q.top();
          Q.pop();
          bic[size].push_back(x);
          if (x == pair<int, int>(v, next)) break;
        }
      }
    } else
      back[v] = min(back[v], disc[next]);
  }
}
int TD[maxn], LOW[maxn];
bool markp[maxn];
int dc_time;
vector<int> ady[maxn];
void A_Points(int nod) {
  LOW[nod] = TD[nod] = ++dc_time;
  int t = ady[nod].size();
  for (int i = 0; i < t; i++) {
    int nn = ady[nod][i];
    if (!LOW[nn]) {
      A_Points(nn);
      LOW[nod] = min(LOW[nod], LOW[nn]);
      if (nod == 1) {
        if (TD[nn] > 2) markp[1] = 1;
        continue;
      }
      if (TD[nod] <= LOW[nn]) markp[nod] = 1;
    } else
      LOW[nod] = min(LOW[nod], TD[nn]);
  }
}
int PA[maxn], NOD[maxn], LCA[5 * maxn][20], L[5 * maxn], C[5 * maxn][20];
vector<int> NC[5 * maxn], NG[5 * maxn];
void bfs(int nodo) {
  queue<int> Q;
  Q.push(nodo);
  L[nodo] = 1;
  while (!Q.empty()) {
    nodo = Q.front();
    Q.pop();
    for (auto i : NG[nodo]) {
      if (L[i]) continue;
      L[i] = L[nodo] + 1;
      LCA[i][0] = nodo;
      C[i][0] = (i > size);
      Q.push(i);
      int lg = log2(L[i]);
      for (int j = 1; j <= lg; j++) {
        LCA[i][j] = LCA[LCA[i][j - 1]][j - 1];
        C[i][j] = C[LCA[i][j - 1]][j - 1] + C[i][j - 1];
      }
    }
  }
}
int QLCA(int a, int b, int &cost) {
  cost = 0;
  if (L[a] < L[b]) swap(a, b);
  int lg = log2(L[a]);
  for (int i = lg; i >= 0; i--)
    if (L[a] - (1 << i) >= L[b]) cost += C[a][i], a = LCA[a][i];
  if (a == b) {
    if (a > size) cost++;
    return a;
  }
  lg = log2(L[a]);
  for (int i = lg; i >= 0; i--)
    if (LCA[a][i] != LCA[b][i] && LCA[a][i])
      cost += C[a][i] + C[b][i], a = LCA[a][i], b = LCA[b][i];
  cost += C[a][0] + C[b][0];
  if (LCA[a][0] > size) cost++;
  return LCA[a][0];
}
int main() {
  cin.tie(0);
  ios_base::sync_with_stdio(0);
  int Qu;
  cin >> V >> E >> Qu;
  for (i = 0; i < E; i++) {
    cin >> a >> b;
    graph[a].push_back(pair<int, int>(b, i));
    graph[b].push_back(pair<int, int>(a, i));
    ady[a].push_back(b);
    ady[b].push_back(a);
  }
  for (i = 1; i <= V; i++)
    if (!disc[i]) dfs(i);
  for (int i = 1; i <= V; i++)
    if (!TD[i]) A_Points(i);
  for (int i = 1; i <= size; i++) {
    for (auto j : bic[i]) {
      NC[i].push_back(j.first);
      NC[i].push_back(j.second);
    }
    sort(NC[i].begin(), NC[i].end());
    NC[i].resize(unique(NC[i].begin(), NC[i].end()) - NC[i].begin());
    for (auto j : NC[i])
      if (!markp[j])
        NOD[j] = i;
      else
        NOD[j] = -1;
  }
  int pa = 0;
  for (int i = 1; i <= V; i++)
    if (markp[i]) PA[++pa] = i, NOD[i] = size + pa;
  for (int i = 1; i <= size; i++) {
    for (auto j : NC[i]) {
      if (markp[j]) NG[i].push_back(NOD[j]), NG[NOD[j]].push_back(i);
    }
  }
  bfs(1);
  int u, v, cost, x;
  while (Qu--) {
    cin >> u >> v;
    if (u == v) {
      cout << "0\n";
      continue;
    }
    a = NOD[u], b = NOD[v];
    if (L[a] < L[b]) swap(a, b), swap(u, v);
    int lca = QLCA(a, b, cost);
    if (a <= size && b <= size) cost++;
    if ((a > size && b > size)) cost--;
    cout << cost << "\n";
  }
  return 0;
}
