#include <bits/stdc++.h>
using namespace std;
const long long INF = 1e9 + 7;
const long long MINT = ~0u >> 1;
const int maxn = 200007;
const int LOG = 20;
struct node {
  int v, next;
} List[maxn];
int head[maxn], cnt;
int n, m;
void add(int u, int v) {
  List[cnt].v = v;
  List[cnt].next = head[u];
  head[u] = cnt++;
}
int sz[maxn], anc[maxn][LOG], deep[maxn];
long long gx[maxn], gxall[maxn];
void Init() {
  memset(head, -1, sizeof(head));
  cnt = 0;
  for (int i = 0; i < maxn; i++)
    for (int j = 0; j < 20; j++) anc[i][j] = 1;
}
pair<int, long long> dfs(int cur, int dp) {
  deep[cur] = dp;
  sz[cur] = 1;
  for (int i = head[cur]; ~i; i = List[i].next) {
    int to = List[i].v;
    if (anc[cur][0] != to) {
      anc[to][0] = cur;
      for (int j = 1; j < LOG; j++) anc[to][j] = anc[anc[to][j - 1]][j - 1];
      pair<int, int> pii = dfs(to, dp + 1);
      sz[cur] += pii.first;
      gx[cur] += pii.first + gx[to];
    }
  }
  return make_pair(sz[cur], gx[cur]);
}
void dfs2(int cur) {
  int fa = anc[cur][0];
  if (cur != 1)
    gxall[cur] = gxall[fa] + n - 2 * sz[cur];
  else
    gxall[cur] = gx[cur];
  for (int i = head[cur]; ~i; i = List[i].next)
    if (anc[cur][0] != List[i].v) dfs2(List[i].v);
}
int Jump(int a, int x) {
  for (int i = 0; i < LOG; i++)
    if (x & (1 << i)) a = anc[a][i];
  return a;
}
int Lca(int u, int v) {
  if (deep[u] < deep[v]) swap(u, v);
  u = Jump(u, deep[u] - deep[v]);
  if (u == v) return u;
  for (int i = LOG - 1; i >= 0; i--) {
    if (anc[u][i] != anc[v][i]) {
      u = anc[u][i];
      v = anc[v][i];
    }
  }
  return anc[u][0];
}
void solve(int u, int v) {
  int lca = Lca(u, v);
  if (lca != u && lca != v) {
    int base = deep[u] - deep[lca] + (deep[v] - deep[lca]);
    long long tn = sz[v];
    long long tm = sz[u];
    double ans = base;
    ans += double(tn * gx[u] + tm * gx[v]) / (tn * tm);
    printf("%.10lf\n", ans + 1);
  } else {
    if (deep[u] < deep[v]) swap(u, v);
    int base = deep[u] - deep[v];
    double ans = base;
    int ancSon = Jump(u, deep[u] - deep[v] - 1);
    long long tn = sz[u];
    long long tm = n - sz[ancSon];
    long long gxu = gxall[lca] - (gx[ancSon] + sz[ancSon]);
    long long gxv = gx[u];
    ans += double(tn * gxu + tm * gxv) / (tn * tm);
    printf("%.10lf\n", ans + 1);
  }
}
int main() {
  Init();
  scanf("%d%d", &n, &m);
  for (int i = 1; i < n; i++) {
    int u, v;
    scanf("%d%d", &u, &v);
    add(u, v);
    add(v, u);
  }
  dfs(1, 0);
  dfs2(1);
  while (m--) {
    int u, v;
    scanf("%d%d", &u, &v);
    solve(u, v);
  }
  return 0;
}
