#include <bits/stdc++.h>
using namespace std;
const int limite = 1000000;
void maximiza(int &a, int b) { a = max(a, b); }
void escribe(string s, vector<long long int> v) {
  cout << s << ": ";
  for (int i = 0; i < int(v.size()); i++) cout << v[i] << ",";
  cout << endl;
}
double calcula(vector<long long int> &cuan1, vector<long long int> &cuanacum1,
               vector<long long int> &cuanprod1, int d1,
               vector<long long int> &cuan2, vector<long long int> &cuanacum2,
               vector<long long int> &cuanprod2, int d2) {
  long long int contados = 0;
  long long int sol = 0;
  int d = max(d1, d2);
  for (int i1 = 0; i1 < int(cuan1.size()); i1++) {
    int i2 = d - i1;
    sol += cuan1[i1] * cuanacum2[i2] * (i1 + 1) + cuan1[i1] * cuanprod2[i2];
    contados += cuan1[i1] * cuanacum2[i2];
  }
  sol += d * (cuanacum1[0] * cuanacum2[0] - contados);
  return double(sol) / (cuanacum1[0] * cuanacum2[0]);
}
int n, m, casos;
vector<int> g[limite];
int u2c[limite];
int c2d[limite];
int visto[limite];
vector<long long int> cuantos[limite];
vector<long long int> cuantosacum[limite];
vector<long long int> cuantosprod[limite];
int profundidad[limite];
vector<int> lista[limite];
void computa(int u, int p, int c) {
  visto[u] = 1;
  profundidad[u] = 0;
  u2c[u] = c;
  vector<int> &ar = g[u];
  vector<int> &lis = lista[u];
  lis.push_back(0);
  for (int i = 0; i < int(ar.size()); i++) {
    int v = ar[i];
    if (v != p) {
      computa(v, u, c);
      lis.push_back(profundidad[v] + 1);
      maximiza(profundidad[u], profundidad[v] + 1);
    }
  }
}
void calcula(int u, int p, int profp) {
  vector<int> &ar = g[u];
  vector<int> &lis = lista[u];
  lis.push_back(profp);
  sort(lis.begin(), lis.end());
  maximiza(c2d[u2c[u]], lis.back());
  for (int i = 0; i < int(ar.size()); i++) {
    int v = ar[i];
    if (v != p) {
      int profu = lis.back();
      if (profundidad[v] + 1 == profu) profu = lis[int(lis.size()) - 2];
      calcula(v, u, profu + 1);
    }
  }
}
void recalcula(int u, int p, vector<long long int> &cuantos) {
  vector<int> &ar = g[u];
  vector<int> &lis = lista[u];
  cuantos[lis.back()]++;
  for (int i = 0; i < int(ar.size()); i++) {
    int v = ar[i];
    if (v != p) recalcula(v, u, cuantos);
  }
}
map<pair<int, int>, double> memoria;
int main() {
  ios::sync_with_stdio(false);
  cout.setf(ios::fixed);
  cout.precision(10);
  cin >> n >> m >> casos;
  for (int i = 0; i < m; i++) {
    int u, v;
    cin >> u >> v;
    g[u].push_back(v);
    g[v].push_back(u);
  }
  int nc = 0;
  for (int u = 1; u <= n; u++) {
    if (not visto[u]) {
      computa(u, 0, nc);
      calcula(u, 0, 0);
      vector<long long int> &cuan = cuantos[nc];
      vector<long long int> &cuanacum = cuantosacum[nc];
      vector<long long int> &cuanprod = cuantosprod[nc];
      cuan = vector<long long int>(c2d[nc] + 1, 0);
      recalcula(u, 0, cuan);
      cuanacum = cuan;
      cuanprod = cuan;
      for (int i = int(cuan.size()) - 1; i >= 0; i--) {
        cuanprod[i] *= i;
        if (i < int(cuan.size()) - 1) {
          cuanacum[i] += cuanacum[i + 1];
          cuanprod[i] += cuanprod[i + 1];
        }
      }
      nc++;
    }
  }
  for (int cas = 0; cas < casos; cas++) {
    int u, v;
    cin >> u >> v;
    int cu = u2c[u];
    int cv = u2c[v];
    if (cu == cv)
      cout << -1 << endl;
    else {
      if (int(cuantos[cu].size()) > int(cuantos[cv].size())) swap(cu, cv);
      pair<int, int> p(cu, cv);
      if (not memoria.count(p))
        memoria[p] =
            calcula(cuantos[cu], cuantosacum[cu], cuantosprod[cu], c2d[cu],
                    cuantos[cv], cuantosacum[cv], cuantosprod[cv], c2d[cv]);
      cout << memoria[p] << endl;
    }
  }
}
