#include <bits/stdc++.h>
using namespace std;
void task();
int main() {
  srand(time(0));
  task();
  return 0;
}
const int INF = 0x3f3f3f3f;
const int N = 3e5 + 10;
const int M = 3e5 + 10;
int n, m;
vector<int> g[N];
int sz[N];
int depth[N];
pair<int, int> q[N];
int tin[N];
int tout[N];
long long int func[N];
int par[N][22];
long long int funcR[N];
void dfs1(int v, int p = -1, int d = 0) {
  static int t = 0;
  tin[v] = t++;
  par[v][0] = p;
  for (int i = 1; par[v][i - 1] != -1; ++i) {
    par[v][i] = par[par[v][i - 1]][i - 1];
  }
  depth[v] = d;
  sz[v] = 1;
  for (int to : g[v])
    if (to != p) {
      dfs1(to, v, d + 1);
      sz[v] += sz[to];
      func[v] += func[to] + sz[to];
    }
  tout[v] = t++;
}
void dfs2(int v, int p = -1, long long int curF = 0, long long int curSz = 0) {
  long long int sum = 0;
  long long int allSz = 0;
  funcR[v] = curF;
  for (int to : g[v])
    if (to != p) {
      sum += func[to] + sz[to];
      allSz += sz[to];
    }
  for (int to : g[v])
    if (to != p) {
      dfs2(to, v,
           curF + (curSz + 1) + sum - (func[to] + sz[to]) + allSz - sz[to],
           curSz + 1 + allSz - sz[to]);
    }
}
int isUpper(int a, int b) {
  return tin[a] <= tin[b] && tin[b] <= tout[a] && tin[a] <= tout[b] &&
         tout[b] <= tout[a];
}
int lca(int a, int b) {
  if (isUpper(a, b)) return a;
  if (isUpper(b, a)) return b;
  for (int i = 21; i >= 0; --i) {
    if (par[a][i] >= 0 && !isUpper(par[a][i], b)) a = par[a][i];
  }
  return par[a][0];
}
int getMe(int a, int b) {
  for (int i = 21; i >= 0; --i) {
    if (par[b][i] >= 0 && !isUpper(par[b][i], a)) b = par[b][i];
  }
  return b;
}
void task() {
  memset(par, -1, sizeof(par));
  scanf("%d %d", &n, &m);
  for (int i = 0; i < n - 1; ++i) {
    int a, b;
    scanf("%d %d", &a, &b);
    --a, --b;
    g[a].push_back(b);
    g[b].push_back(a);
  }
  for (int i = 0; i < n; ++i) sort((g[i].begin()), (g[i].end()));
  for (int i = 0; i < m; ++i) {
    scanf("%d %d", &q[i].first, &q[i].second);
  }
  dfs1(0);
  dfs2(0);
  for (int i = 0; i < m; ++i) {
    int a = q[i].first - 1;
    int b = q[i].second - 1;
    int c = lca(a, b);
    if (c == b) swap(a, b);
    (void(1));
    ;
    if (c == a) {
      int u = getMe(a, b);
      (void(1));
      ;
      int upLen = depth[b] - depth[a];
      double ans = upLen + 1;
      ans += func[b] / double(sz[b]);
      if (a == 0) {
        long long int funcNew = func[a] - (func[u] + sz[u]);
        long long int szNew = sz[a] - sz[u];
        ans += funcNew / double(szNew);
      } else {
        long long int funcNew1 = func[a] - (func[u] + sz[u]);
        long long int szNew1 = sz[a] - sz[u];
        long long int funcNew2 = funcR[a];
        long long int szNew2 = sz[0] - sz[a];
        long long int funcNew = funcNew1 + funcNew2;
        long long int szNew = szNew1 + szNew2;
        ans += funcNew / double(szNew);
      }
      printf("%.9f\n", ans);
    } else {
      int upLen = depth[a] - depth[c] + depth[b] - depth[c];
      double ans = upLen + 1;
      ans += func[a] / double(sz[a]);
      ans += func[b] / double(sz[b]);
      printf("%.9f\n", ans);
    }
  }
}
