#include <bits/stdc++.h>
using namespace std;
const int maxn = 1E5 + 7;
const int log2maxn = 18;
struct EDGE {
  int to, next;
} edges[maxn * 2];
int cEdge = 1, head[maxn];
void addEdge(int from, int to) {
  edges[cEdge] = (EDGE){to, head[from]};
  head[from] = cEdge++;
}
int N, M;
long long D[maxn], U[maxn];
int size[maxn];
void dfs1(int u, int pa) {
  size[u] = 1;
  for (int k = head[u]; k; k = edges[k].next) {
    int v = edges[k].to;
    if (v == pa) continue;
    dfs1(v, u);
    size[u] += size[v];
    D[u] += D[v] + size[v];
  }
}
void dfs2(int u, int pa) {
  if (pa) U[u] = U[pa] + D[pa] - D[u] - (size[u] << 1) + size[1];
  for (int k = head[u]; k; k = edges[k].next) {
    int v = edges[k].to;
    if (v == pa) continue;
    dfs2(v, u);
  }
}
int H[maxn], fa[maxn][log2maxn], cx[maxn][log2maxn];
void dfs3(int u, int pa) {
  H[u] = H[pa] + 1;
  fa[u][0] = pa;
  for (int i = 1; i < log2maxn; ++i) fa[u][i] = fa[fa[u][i - 1]][i - 1];
  cx[u][0] = u;
  for (int i = 1; i < log2maxn; ++i) cx[u][i] = cx[fa[u][i - 1]][i - 1];
  for (int k = head[u]; k; k = edges[k].next) {
    int v = edges[k].to;
    if (v == pa) continue;
    dfs3(v, u);
  }
}
int lca(int a, int b) {
  if (H[a] < H[b]) swap(a, b);
  for (int i = log2maxn - 1; i >= 0; --i)
    if (H[fa[a][i]] >= H[b]) a = fa[a][i];
  if (a == b) return a;
  for (int i = log2maxn - 1; i >= 0; --i)
    if (fa[a][i] != fa[b][i]) a = fa[a][i], b = fa[b][i];
  return fa[a][0];
}
int getcx(int a, int b) {
  int ret = -1;
  for (int i = log2maxn - 1; i >= 0; --i)
    if (H[fa[b][i]] >= H[a]) {
      ret = cx[b][i];
      b = fa[b][i];
    }
  return ret;
}
double solve(int a, int b) {
  double ans = 1;
  if (H[a] > H[b]) swap(a, b);
  int l = lca(a, b);
  ans += H[a] + H[b] - (H[l] << 1);
  if (l == a) {
    int cx = getcx(a, b);
    long long tot = U[a];
    for (int k = head[a]; k; k = edges[k].next) {
      int v = edges[k].to;
      if (v == fa[a][0] || v == cx) continue;
      tot += D[v] + size[v];
    }
    ans += tot / (size[1] - size[cx] + 0.0);
  } else {
    ans += D[a] / (size[a] + 0.0);
  }
  ans += D[b] / (size[b] + 0.0);
  return ans;
}
int main() {
  scanf("%d%d", &N, &M);
  for (int i = 1; i < N; ++i) {
    int a, b;
    scanf("%d%d", &a, &b);
    addEdge(a, b), addEdge(b, a);
  }
  dfs1(1, 0);
  dfs2(1, 0);
  dfs3(1, 0);
  while (M--) {
    int u, v;
    scanf("%d%d", &u, &v);
    printf("%.9lf\n", solve(u, v));
  }
}
