#include <bits/stdc++.h>
using namespace std;
const int N = 200050;
vector<int> vec[N], dis[N], sum[N];
struct Node {
  int x, y;
  double ans;
} JY;
bool operator<(Node a, Node b) {
  if (a.x != b.x) return a.x < b.x;
  return a.y < b.y;
}
set<Node> s;
set<Node>::iterator it;
int n, m, q, first[N], nxt[N], v[N], w[N], tot, root, xx, yy, vis[N];
int maxx[N][2], rec[N][2], f[N], Root[N], vv[N], fi, flag, size[N];
void add(int x, int y) {
  w[tot] = 1, v[tot] = y, nxt[tot] = first[x], first[x] = tot++;
}
int find(int x) { return x == f[x] ? x : f[x] = find(f[x]); }
void get_dia(int x, int fa) {
  rec[x][0] = rec[x][1] = x;
  for (int i = first[x]; ~i; i = nxt[i])
    if (v[i] != fa) {
      get_dia(v[i], x);
      if (maxx[v[i]][0] + w[i] > maxx[x][0])
        maxx[x][1] = maxx[x][0], rec[x][1] = rec[x][0],
        maxx[x][0] = maxx[v[i]][0] + w[i], rec[x][0] = rec[v[i]][0];
      else if (maxx[v[i]][0] + w[i] > maxx[x][1])
        maxx[x][1] = maxx[v[i]][0] + w[i], rec[x][1] = rec[v[i]][0];
    }
  if (maxx[x][0] + maxx[x][1] > maxx[root][0] + maxx[root][1]) root = x;
}
void DFS(int x, int fa, int deep) {
  vv[x] = max(vv[x], deep);
  if (flag) vec[fi].push_back(vv[x]), size[fi]++;
  for (int i = first[x]; ~i; i = nxt[i])
    if (v[i] != fa) {
      DFS(v[i], x, deep + w[i]);
    }
}
int main() {
  memset(first, -1, sizeof(first));
  scanf("%d%d%d", &n, &m, &q);
  for (int i = 1; i <= n; i++) f[i] = i;
  for (int i = 1; i <= m; i++)
    scanf("%d%d", &xx, &yy), add(xx, yy), add(yy, xx), f[find(xx)] = find(yy);
  for (int i = 1; i <= n; i++) {
    fi = find(i);
    if (!rec[fi][0]) {
      root = flag = 0, get_dia(i, 0), Root[fi] = root;
      DFS(rec[root][0], 0, 0), flag = 1, DFS(rec[root][1], 0, 0);
    }
  }
  for (int i = 1; i <= n; i++) {
    fi = find(i);
    if (!vis[fi]) {
      vis[fi] = 1;
      dis[fi].resize(size[fi] + 1), sum[fi].resize(size[fi] + 1);
      for (int j = 0; j < vec[fi].size(); j++)
        dis[fi][vec[fi][j]]++, sum[fi][vec[fi][j]] += vec[fi][j];
      for (int j = size[fi] - 1; j >= 0; j--)
        dis[fi][j] += dis[fi][j + 1], sum[fi][j] += sum[fi][j + 1];
    }
  }
  while (q--) {
    scanf("%d%d", &xx, &yy);
    int fx = find(xx), fy = find(yy);
    if (fx == fy) {
      puts("-1");
      continue;
    }
    if (vec[fx].size() > vec[fy].size()) swap(xx, yy), swap(fx, fy);
    JY.x = fx, JY.y = fy;
    if ((it = s.find(JY)) != s.end()) {
      printf("%.10lf\n", it->ans);
      continue;
    }
    int dis1 = maxx[Root[fx]][0] + maxx[Root[fx]][1];
    int dis2 = maxx[Root[fy]][0] + maxx[Root[fy]][1];
    int Dis = max(dis1, dis2);
    long long ans = 0;
    for (int i = 0; i < vec[fx].size(); i++) {
      ans += sum[fy][Dis - vec[fx][i]] +
             1ll * dis[fy][Dis - vec[fx][i]] * (vec[fx][i] + 1);
      ans += 1ll * Dis * (size[fy] - dis[fy][Dis - vec[fx][i]]);
    }
    JY.ans = (double)ans / size[fx] / size[fy], s.insert(JY);
    printf("%.10lf\n", (double)ans / size[fx] / size[fy]);
  }
}
