#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1e5 + 5, MAXLOGN = 20;
int n, m;
int Par[MAXN];
int ind_Par[MAXN];
int deep[MAXN];
int dp[MAXLOGN][MAXN];
vector<pair<pair<int, int>, pair<long double, long double> > > G[MAXN];
pair<long double, long double> dfs1(int v = 0, int par = -1) {
  long double cnt = 0, dis = 0;
  for (int i = 0; i < G[v].size(); i++)
    if (G[v][i].first.first != par) {
      G[v][i].second = dfs1(G[v][i].first.first, v);
      cnt += G[v][i].second.first;
      dis += G[v][i].second.second;
      G[v][i].second.first++;
      G[v][i].second.second += G[v][i].second.first;
    }
  return {cnt + 1, dis + cnt + 1};
}
void dfs2(int v = 0, int par = -1) {
  if (G[v].size() == 1 && v) return;
  long double cnt = 0, dis = 0;
  for (int i = 0; i < G[v].size(); i++) {
    cnt += G[v][i].second.first;
    dis += G[v][i].second.second;
  }
  cnt -= (long double)G[v].size() - 2;
  dis -= (long double)G[v].size() - 2;
  for (int i = 0; i < G[v].size(); i++)
    if (G[v][i].first.first != par) {
      G[G[v][i].first.first][G[v][i].first.second].second.first =
          cnt - G[v][i].second.first + 1;
      G[G[v][i].first.first][G[v][i].first.second].second.second =
          dis - G[v][i].second.second +
          G[G[v][i].first.first][G[v][i].first.second].second.first;
      dfs2(G[v][i].first.first, v);
    }
}
void dfs3(int v = 0, int par = 0, int index = 0) {
  Par[v] = par;
  ind_Par[v] = index;
  deep[v] = 1 + deep[par];
  for (int i = 0; i < G[v].size(); i++)
    if (G[v][i].first.first != par) dfs3(G[v][i].first.first, v, i);
}
void pre_process() {
  for (int i = 0; i < n; i++) dp[0][i] = Par[i];
  for (int i = 1; i < MAXLOGN; i++)
    for (int j = 0; j < n; j++) dp[i][j] = dp[i - 1][dp[i - 1][j]];
}
long double calc(int v, int index_v, int u, int index_u, int dis) {
  long double tmp1 =
      (G[v][index_v].second.second - 2 * G[v][index_v].second.first + 1) *
      (G[u][index_u].second.first - 1);
  long double tmp2 =
      (G[u][index_u].second.second - 2 * G[u][index_u].second.first + 1) *
      (G[v][index_v].second.first - 1);
  long double tmp3 =
      dis * (G[v][index_v].second.first - 1) * (G[u][index_u].second.first - 1);
  long double tmp4 =
      (G[v][index_v].second.first - 1) * (G[u][index_u].second.first - 1);
  return ((tmp1 + tmp2 + tmp3 + tmp4) / tmp4);
}
long double lca(int v, int u) {
  if (deep[v] < deep[u]) swap(v, u);
  int V = v, U = u;
  int dis = max(deep[v] - deep[u] - 1, 0);
  for (int i = MAXLOGN - 1; ~i; i--)
    if ((dis >> i) & 1) v = dp[i][v];
  if (Par[v] == u)
    return calc(Par[V], ind_Par[V], v, G[u][ind_Par[v]].first.second,
                deep[V] - deep[U]);
  if (deep[v] > deep[u]) v = Par[v];
  dis = 0;
  for (int i = MAXLOGN - 1; ~i; i--)
    if (dp[i][v] != dp[i][u]) {
      dis += (1 << (i + 1));
      v = dp[i][v];
      u = dp[i][u];
    }
  return calc(Par[V], ind_Par[V], Par[U], ind_Par[U],
              deep[V] - deep[U] + dis + 2);
}
int main() {
  scanf("%d%d", &n, &m);
  for (int i = 1; i < n; i++) {
    int v, u;
    scanf("%d%d", &v, &u);
    v--;
    u--;
    G[v].push_back({{u, G[u].size()}, {0, 0}});
    G[u].push_back({{v, G[v].size() - 1}, {0, 0}});
  }
  dfs1();
  dfs2();
  dfs3();
  pre_process();
  while (m--) {
    int v, u;
    scanf("%d%d", &v, &u);
    v--;
    u--;
    printf("%Lf\n", lca(v, u));
  }
}
