#include <bits/stdc++.h>
using namespace std;
bool _1;
inline void Max(long long &a, long long b) { ((a < b) && (a = b)); }
inline void Min(long long &a, long long b) { ((a > b) && (a = b)); }
const long long N = 100005;
long long n, m;
vector<long long> edge[N];
long long fa[N][20], dep[N], sz[N];
void dfs1(long long x, long long f) {
  fa[x][0] = f;
  sz[x] = 1;
  for (long long i = 1; i <= 18; i++) fa[x][i] = fa[fa[x][i - 1]][i - 1];
  for (long long i = 0; i < edge[x].size(); i++) {
    long long y = edge[x][i];
    if (y == f) continue;
    dep[y] = dep[x] + 1;
    dfs1(y, x);
    sz[x] += sz[y];
  }
}
long long LCA(long long x, long long y) {
  if (dep[x] < dep[y]) swap(x, y);
  long long l = dep[x] - dep[y];
  for (long long i = 0; i <= 18; i++)
    if (l & (1 << i)) x = fa[x][i];
  if (x == y) return x;
  for (long long i = 18; i >= 0; i--)
    if (fa[x][i] != fa[y][i]) x = fa[x][i], y = fa[y][i];
  return fa[x][0];
}
long long Dis(long long x, long long y) {
  return dep[x] + dep[y] - 2 * dep[LCA(x, y)];
}
long long gcd(long long x, long long y) { return y == 0 ? x : gcd(y, x % y); }
struct que {
  long long x, y;
} q[N];
namespace P1 {
long long res;
void dfs(long long x, long long f, long long d, long long mul) {
  res += d * mul;
  for (long long i = 0; i < edge[x].size(); i++) {
    long long y = edge[x][i];
    if (y == f) continue;
    dfs(y, x, d + 1, mul);
  }
}
void solve() {
  for (long long T = 1; T <= m; T++) {
    long long x = q[T].x, y = q[T].y;
    if (dep[x] < dep[y]) swap(x, y);
    long long lca = LCA(x, y);
    res = 0;
    long long cnt;
    if (lca == y) {
      long long t = x, l = dep[x] - dep[y] - 1;
      for (long long i = 18; i >= 0; i--)
        if (l & (1 << i)) t = fa[t][i];
      cnt = sz[x] * (n - sz[t]);
      dfs(y, t, 0, sz[x]);
      dfs(x, fa[x][0], 0, n - sz[t]);
      res += (dep[x] - dep[y] + 1) * cnt;
    } else {
      cnt = sz[x] * sz[y];
      dfs(x, fa[x][0], 0, sz[y]);
      dfs(y, fa[y][0], 0, sz[x]);
      res += (Dis(x, y) + 1) * cnt;
    }
    long long G = gcd(res, cnt);
    printf("%lld/%lld\n", res / G, cnt / G);
  }
}
}  // namespace P1
namespace P2 {
void solve() {
  for (long long i = 1; i <= m; i++) {
    long long x = q[i].x, y = q[i].y;
    if (x > y) swap(x, y);
    long long cnt = (n - y + 1) * x;
    long long res = (y - x + 1) * cnt;
    res += x * (x - 1) / 2 * (n - y + 1);
    res += (n - y) * (n - y + 1) / 2 * x;
    long long G = gcd(res, cnt);
    printf("%lld/%lld\n", res / G, cnt / G);
  }
}
}  // namespace P2
namespace P3 {
long long sum[N];
void dfs(long long x, long long f) {
  sum[x] = dep[x];
  for (long long i = 0; i < edge[x].size(); i++) {
    long long y = edge[x][i];
    if (y == f) continue;
    dfs(y, x);
    sum[x] += sum[y];
  }
}
void solve() {
  dfs(1, 0);
  for (long long i = 1; i <= m; i++) {
    if (q[i].x != 1) swap(q[i].x, q[i].y);
    long long x = q[i].y;
    long long l = dep[x] - 2, t = x;
    for (long long j = 0; j <= 18; j++)
      if (l & (1 << j)) t = fa[t][j];
    long long cnt = sz[x] * (n - sz[t]);
    long long res = (n - sz[t]) * (sum[x] - sz[x] * dep[x]);
    long long nw = sum[1] - sum[t];
    res += (nw - dep[1] * (n - sz[t])) * sz[x];
    res += dep[x] * cnt;
    long long G = gcd(res, cnt);
    printf("%lld/%lld\n", res / G, cnt / G);
  }
}
}  // namespace P3
struct tzy {
  long long son, id;
};
long long Ans[N];
vector<tzy> E[N];
namespace P4 {
long long sum[N];
void dfs0(long long x, long long f) {
  sum[x] = 0;
  for (long long i = 0; i < edge[x].size(); i++) {
    long long y = edge[x][i];
    if (y == f) continue;
    dfs0(y, x);
    sum[x] += sum[y] + sz[y];
  }
}
inline void change(long long x, long long y) {
  sum[x] -= sum[y] + sz[y];
  sz[x] -= sz[y];
  sz[y] += sz[x];
  sum[y] += sum[x] + sz[x];
}
long long Ans[N];
void dfs(long long x, long long f) {
  for (long long i = 0; i < E[x].size(); i++) {
    long long y = E[x][i].son, id = E[x][i].id;
    Ans[id] = sum[x] - (sum[y] + sz[y]);
  }
  for (long long i = 0; i < edge[x].size(); i++) {
    long long y = edge[x][i];
    if (y == f) continue;
    change(x, y);
    dfs(y, x);
    change(y, x);
  }
}
void solve() {
  dfs0(1, 0);
  for (long long i = 1; i <= m; i++) {
    long long x = q[i].x, y = q[i].y;
    if (dep[x] < dep[y]) swap(x, y);
    long long lca = LCA(x, y);
    if (lca == y) {
      long long t = x, l = dep[x] - dep[y] - 1;
      for (long long j = 0; j <= 18; j++)
        if (l & (1 << j)) t = fa[t][j];
      E[y].push_back((tzy){t, i});
    }
  }
  dfs(1, 0);
  for (long long i = 1; i <= m; i++) {
    long long x = q[i].x, y = q[i].y;
    if (dep[x] < dep[y]) swap(x, y);
    long long lca = LCA(x, y), cnt, res;
    if (lca == y) {
      long long t = x, l = dep[x] - dep[y] - 1;
      for (long long j = 0; j <= 18; j++)
        if (l & (1 << j)) t = fa[t][j];
      long long cnt1 = sz[x], cnt2 = n - sz[t];
      cnt = cnt1 * cnt2;
      res = cnt2 * sum[x] + cnt1 * Ans[i];
      res += (dep[x] - dep[y] + 1) * cnt;
    } else {
      cnt = sz[x] * sz[y];
      res = sz[x] * sum[y] + sz[y] * sum[x] + (Dis(x, y) + 1) * cnt;
    }
    printf("%.8lf\n", 1.0 * res / cnt);
  }
}
}  // namespace P4
int main() {
  scanf("%lld%lld", &n, &m);
  bool flag = 1;
  for (long long i = 1, x, y; i < n; i++) {
    scanf("%lld%lld", &x, &y);
    if (abs(x - y) > 1) flag = 0;
    edge[x].push_back(y);
    edge[y].push_back(x);
  }
  dfs1(1, 0);
  bool flag1 = 1;
  for (long long i = 1; i <= m; i++) {
    scanf("%lld%lld", &q[i].x, &q[i].y);
    if (q[i].x != 1 && q[i].y != 1) flag1 = 0;
  }
  P4::solve();
  return 0;
}
