#include <bits/stdc++.h>
using namespace std;
int leaf[100010], d[100010], parent[100010][20], n, m;
vector<int> a[100010];
long long road[100010], roadS[100010], siz[100010];
void dfs(int u, int p) {
  siz[u] = 1;
  leaf[u] = 0;
  road[u] = 0;
  int cnt = 0;
  for (int i = (0); i <= (int((a[u]).size()) - 1); i++) {
    int v = a[u][i];
    if (v == p) continue;
    cnt++;
    d[v] = d[u] + 1;
    parent[v][0] = u;
    dfs(v, u);
    siz[u] += siz[v];
    leaf[u] += leaf[v];
    road[u] += siz[v] + road[v];
  }
  if (!cnt) leaf[u] = 1;
}
void dfs2(int u, int p) {
  for (int i = (0); i <= (int((a[u]).size()) - 1); i++) {
    int v = a[u][i];
    if (v == p) continue;
    roadS[v] = roadS[u] - siz[v] + siz[1] - siz[v];
    dfs2(v, u);
  }
}
int lca(int u, int v) {
  if (d[v] < d[u])
    for (int i = (17); i >= (0); i--)
      if (d[parent[u][i]] >= d[v]) u = parent[u][i];
  if (d[u] < d[v])
    for (int i = (17); i >= (0); i--)
      if (d[parent[v][i]] >= d[u]) v = parent[v][i];
  for (int i = (17); i >= (0); i--)
    if (parent[u][i] != parent[v][i]) {
      u = parent[u][i];
      v = parent[v][i];
    }
  while (u != v) {
    u = parent[u][0];
    v = parent[v][0];
  }
  return u;
}
int getParent(int u, int h) {
  for (int i = (17); i >= (0); i--)
    if (h & (1 << i)) u = parent[u][i];
  return u;
}
void init() {
  d[1] = 1;
  dfs(1, 0);
  for (int j = (1); j <= (17); j++)
    for (int i = (1); i <= (n); i++)
      parent[i][j] = parent[parent[i][j - 1]][j - 1];
  roadS[1] = road[1];
  dfs2(1, 0);
}
int main() {
  ios::sync_with_stdio(0);
  cin.tie(NULL);
  cin >> n >> m;
  for (int i = (1); i <= (n - 1); i++) {
    int u, v;
    cin >> u >> v;
    a[u].push_back(v);
    a[v].push_back(u);
  }
  init();
  while (m--) {
    int u, v;
    cin >> u >> v;
    int g = lca(u, v);
    if (g == v) swap(u, v);
    double res = 0;
    if (g == u) {
      int dist = d[v] - d[u];
      int h = getParent(v, dist - 1);
      int sizU = n - siz[h];
      long long roadU = roadS[u] - siz[h] - road[h];
      res = (long long)sizU * siz[v] * (dist + 1) + (long long)siz[v] * roadU +
            (long long)sizU * road[v];
      res /= (long long)sizU * siz[v];
    } else {
      res = (long long)siz[u] * siz[v] * (d[u] + d[v] - 2 * d[g] + 1) +
            (long long)siz[v] * road[u] + (long long)siz[u] * road[v];
      res /= (long long)siz[u] * siz[v];
    }
    cout << fixed << setprecision(9) << res << "\n";
  }
  return 0;
}
