#include <bits/stdc++.h>
using namespace std;
inline int in() {
  int x = 0;
  char ch = getchar();
  while (ch > '9' || ch < '0') ch = getchar();
  while (ch >= '0' && ch <= '9') x = x * 10 + ch - '0', ch = getchar();
  return x;
}
const int maxn = 100010;
struct Node {
  int data, next;
} node[maxn << 1];
int n, m, cnt;
int head[maxn], d[maxn];
int sz[maxn];
long long Ddc[maxn], Adc[maxn];
int f[maxn][18];
double ans;
void add(int u, int v) {
  node[cnt].data = v;
  node[cnt].next = head[u];
  head[u] = cnt++;
  node[cnt].data = u;
  node[cnt].next = head[v];
  head[v] = cnt++;
}
void dfs(int x, int fa) {
  for (int i = 1; i <= 17; i++) f[x][i] = f[f[x][i - 1]][i - 1];
  for (int point = head[x]; point != -1; point = node[point].next)
    if (node[point].data != fa) {
      f[node[point].data][0] = x;
      d[node[point].data] = d[x] + 1;
      dfs(node[point].data, x);
      sz[x] += sz[node[point].data];
      Ddc[x] += Ddc[node[point].data] + sz[node[point].data];
    }
  sz[x]++;
}
void dfs2(int x, int fa) {
  if (fa) Adc[x] = Adc[fa] + n - (sz[x] << 1);
  for (int point = head[x]; point != -1; point = node[point].next)
    if (node[point].data != fa) dfs2(node[point].data, x);
}
int LCA(int x, int y) {
  int tmp = d[x] - d[y];
  for (int i = 17; i >= 0; i--)
    if ((1 << i) & tmp) x = f[x][i];
  if (x == y) return x;
  for (int i = 17; i >= 0; i--)
    if (f[x][i] != f[y][i]) x = f[x][i], y = f[y][i];
  return f[x][0];
}
int get_fa(int x, int t) {
  for (int i = 17; i >= 0; i--)
    if ((1 << i) & t) x = f[x][i];
  return x;
}
int main() {
  int u, v, x, L, Lca;
  n = in();
  m = in();
  for (int i = 1; i <= n; i++) head[i] = -1;
  for (int i = 1; i < n; i++) u = in(), v = in(), add(u, v);
  dfs(1, 0);
  Adc[1] = Ddc[1];
  dfs2(1, 0);
  while (m--) {
    u = in(), v = in();
    if (d[u] < d[v]) swap(u, v);
    Lca = LCA(u, v);
    if (Lca == v) {
      x = get_fa(u, d[u] - d[v] - 1);
      long long Ddcv = Adc[x] - Ddc[x] - n + sz[x], szv = n - sz[x];
      long long rec = (long long)sz[u] * Ddcv + (long long)szv * Ddc[u];
      long long tot = (long long)sz[u] * szv;
      ans = (double)rec / tot + d[u] - d[v] + 1;
    } else {
      long long rec = (long long)sz[u] * Ddc[v] + (long long)sz[v] * Ddc[u];
      long long tot = (long long)sz[u] * sz[v];
      ans = (double)rec / tot + d[u] + d[v] - d[Lca] * 2 + 1;
    }
    printf("%.7lf\n", ans);
  }
  return 0;
}
