#include <bits/stdc++.h>
using namespace std;
inline int Read() {
  int x(0), f(1);
  char c(getchar());
  while (c < '0' || '9' < c) {
    if (c == '-') {
      f = -1;
    }
    c = getchar();
  }
  while ('0' <= c && c <= '9') {
    x = (x << 1) + (x << 3) + c - '0';
    c = getchar();
  }
  return f * x;
}
const int MAXN = 1e5 + 5;
int n, m;
struct Edge {
  int to, next;
} edge[MAXN * 2];
int edge_head[MAXN];
int edge_cnt = 0;
void AddEdge(int form, int to) {
  edge[++edge_cnt].to = to;
  edge[edge_cnt].next = edge_head[form];
  edge_head[form] = edge_cnt;
}
long long f[MAXN];
long long dp[MAXN];
int father[MAXN];
int siz[MAXN];
void DFS_DP_1(int now = 1) {
  siz[now] = 1;
  for (int edge_i = edge_head[now]; edge_i; edge_i = edge[edge_i].next) {
    if (edge[edge_i].to ^ father[now]) {
      father[edge[edge_i].to] = now;
      DFS_DP_1(edge[edge_i].to);
      siz[now] += siz[edge[edge_i].to];
      f[now] += f[edge[edge_i].to] + siz[edge[edge_i].to];
    }
  }
}
void DFS_DP_2(int now = 1) {
  if (now == 1) {
    dp[now] = f[now];
  } else {
    dp[now] = dp[father[now]] - (f[now] + siz[now]) + (n - siz[now]) + f[now];
  }
  for (int edge_i = edge_head[now]; edge_i; edge_i = edge[edge_i].next) {
    if (edge[edge_i].to ^ father[now]) {
      DFS_DP_2(edge[edge_i].to);
    }
  }
}
int point_deep[MAXN];
int point_father[MAXN];
int point_son[MAXN];
int point_size[MAXN];
int chain_cnt = 0;
int point_id[MAXN];
int chain_top[MAXN];
void DFS_1(int now = 1) {
  int max_size = -1;
  point_size[now] = 1;
  for (int edge_i = edge_head[now]; edge_i; edge_i = edge[edge_i].next) {
    if (point_father[now] != edge[edge_i].to) {
      point_father[edge[edge_i].to] = now;
      point_deep[edge[edge_i].to] = point_deep[now] + 1;
      DFS_1(edge[edge_i].to);
      point_size[now] += point_size[edge[edge_i].to];
      if (point_size[edge[edge_i].to] > max_size) {
        max_size = point_size[edge[edge_i].to];
        point_son[now] = edge[edge_i].to;
      }
    }
  }
}
void DFS_2(int now = 1, int top = 1) {
  point_id[now] = ++chain_cnt;
  chain_top[now] = top;
  if (!point_son[now]) {
    return;
  }
  DFS_2(point_son[now], top);
  for (int edge_i = edge_head[now]; edge_i; edge_i = edge[edge_i].next) {
    if (edge[edge_i].to != point_father[now] &&
        edge[edge_i].to != point_son[now]) {
      DFS_2(edge[edge_i].to, edge[edge_i].to);
    }
  }
}
int LCA(int u, int v) {
  while (chain_top[u] != chain_top[v]) {
    if (point_deep[chain_top[u]] < point_deep[chain_top[v]]) {
      swap(u, v);
    }
    u = point_father[chain_top[u]];
  }
  if (point_deep[u] > point_deep[v]) {
    swap(u, v);
  }
  return u;
}
int FindSon(int u, int v) {
  while (chain_top[u] ^ chain_top[v]) {
    if (point_deep[chain_top[u]] < point_deep[chain_top[v]]) {
      swap(u, v);
    }
    if (point_father[chain_top[u]] == v) {
      return chain_top[u];
    }
    u = point_father[chain_top[u]];
  }
  if (point_deep[u] > point_deep[v]) {
    swap(u, v);
  }
  return point_son[u];
}
int main() {
  scanf("%d%d", &n, &m);
  int a, b;
  for (int i = 1; i <= n - 1; ++i) {
    a = Read();
    b = Read();
    AddEdge(a, b);
    AddEdge(b, a);
  }
  DFS_1();
  DFS_2();
  DFS_DP_1();
  DFS_DP_2();
  for (int i = 1; i <= m; ++i) {
    a = Read();
    b = Read();
    if (a == b) {
      printf("0\n");
    } else {
      if (point_deep[b] < point_deep[a]) {
        swap(a, b);
      }
      int lca = LCA(a, b);
      int len = point_deep[a] + point_deep[b] - 2 * point_deep[lca];
      long long val;
      long long sum;
      if (lca == a) {
        int fson = FindSon(a, b);
        val = 1ll * siz[b] * (n - siz[fson]);
        sum = f[b] * (n - siz[fson]) + siz[b] * (dp[a] - f[fson] - siz[fson]);
      } else {
        val = 1ll * siz[a] * siz[b];
        sum = siz[b] * f[a] + siz[a] * f[b];
      }
      printf("%.7lf\n", (sum + 1ll * len * val + val) * 1.0 / val);
    }
  }
  return 0;
}
