#include <bits/stdc++.h>
using namespace std;
using ld = long double;
using ll = long long;
using vi = vector<int>;
using vll = vector<ll>;
const ld eps = 1e-8l;
const int INF = 1e9 + 10;
const ll INFL = 9 * 1e18;
const ll MOD = 1e9 + 7;
const ld Pi = acosl(-1.0l);
class graph {
 private:
  vector<vi> cliq, gr;
  vi was, tin, fup, tout, h;
  int n, timer, clcnt;
  stack<tuple<int, int>> st;
  static const int LOG = 18;
  vi par[LOG];

 public:
  graph(int nx) : n(nx) {
    gr.resize(n);
    was.resize(n);
    tin.resize(n);
    tout.resize(n);
    fup.resize(n);
    h.resize(n);
    cliq.resize(n);
    timer = clcnt = 0;
    for (int i = 0; i < (int)(LOG); i++) par[i].resize(n);
  }
  void addedge(int a, int b) {
    gr[a].push_back(b);
    gr[b].push_back(a);
  }
  void mark(int v, int p = -1) {
    if (0) cerr << "mark at " << v << '\n';
    tin[v] = fup[v] = timer++;
    was[v] = 1;
    for (auto to : gr[v]) {
      if (to == p) continue;
      ;
      ;
      if (was[to]) {
        fup[v] = min(fup[v], tin[to]);
        if (tin[to] < tin[v]) st.push({v, to});
      } else {
        st.push({v, to});
        mark(to, v);
        fup[v] = min(fup[v], fup[to]);
        if (fup[to] >= tin[v]) {
          if (0) cerr << "im point " << v << ' ' << '\n';
          while (st.top() != make_tuple(v, to)) {
            auto [u1, u2] = st.top();
            st.pop();
            if (0) cerr << "add " << u1 << ' ' << u2 << '\n';
            cliq[clcnt].push_back(u1);
            cliq[clcnt].push_back(u2);
          }
          if (0) cerr << "add " << v << ' ' << to << '\n';
          cliq[clcnt].push_back(v);
          cliq[clcnt].push_back(to);
          clcnt++;
          st.pop();
        }
      }
    }
  }
  bool isancestor(int a, int b) {
    return tin[a] <= tin[b] && tout[a] >= tout[b];
  }
  void dfs(int v, int px = -1, int hx = 0) {
    if (0) cerr << "dfs at " << v << '\n';
    tin[v] = timer++;
    h[v] = hx;
    par[0][v] = (px == -1 ? v : px);
    for (auto to : gr[v]) {
      if (to != px) dfs(to, v, hx + 1);
    }
    tout[v] = timer++;
  }
  graph mt() {
    graph t(2 * n);
    mark(0);
    for (int i = 0; i < (int)(clcnt); i++) {
      sort((cliq[i]).begin(), (cliq[i]).end());
      cliq[i].erase(unique((cliq[i]).begin(), (cliq[i]).end()), cliq[i].end());
      if (0) cerr << "cliq numb " << i << '\n';
      for (int v : cliq[i]) {
        ;
        ;
        t.addedge(v, n + i);
      }
    }
    return t;
  }
  void buildlca() {
    dfs(0);
    for (int i = 0; i < (int)(LOG); i++)
      if (i) {
        for (int v = 0; v < (int)(n); v++)
          par[i][v] = par[i - 1][par[i - 1][v]];
      }
  }
  int lca(int a, int b) {
    if (isancestor(a, b)) return a;
    for (int i = LOG - 1; i >= 0; i--)
      if (!isancestor(par[i][a], b)) a = par[i][a];
    return par[0][a];
  }
  int getdist(int a, int b) { return h[a] + h[b] - 2 * h[lca(a, b)]; }
};
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.precision(9);
  cout << fixed;
  int n, m, q;
  cin >> n >> m >> q;
  graph g(n);
  for (int i = 0; i < (int)(m); i++) {
    int a, b;
    cin >> a >> b;
    a--;
    b--;
    g.addedge(a, b);
  }
  graph t = g.mt();
  t.buildlca();
  for (int i = 0; i < (int)(q); i++) {
    int a, b;
    cin >> a >> b;
    a--;
    b--;
    cout << t.getdist(a, b) / 2 << '\n';
  }
}
