#include <bits/stdc++.h>
using namespace std;
void smain();
int main() {
  ios_base::sync_with_stdio(0);
  cout.precision(12);
  cout << fixed;
  smain();
  return 0;
}
vector<long long> edges[100001];
vector<pair<long long, long long> > q[100001];
long long n, m;
long long dsu[100001], anc[100001], cur[100001], h[100001], sz[100001],
    s[100001], su[100001];
double ans[100001];
bool used[100001];
long long get_dsu(long long v) {
  return v == dsu[v] ? v : dsu[v] = get_dsu(dsu[v]);
}
void unite(long long a, long long b, long long c) {
  a = get_dsu(a), b = get_dsu(b);
  if (rand() & 1) swap(a, b);
  dsu[a] = b, anc[b] = c;
}
void dfs1(long long v, long long p = -1) {
  sz[v] = 1, s[v] = 0;
  for (auto i : edges[v])
    if (i != p) {
      h[i] = h[v] + 1;
      dfs1(i, v);
      sz[v] += sz[i];
      s[v] += s[i] + sz[i];
    }
}
void dfs(long long v, long long p = -1) {
  if (p != -1) su[v] = s[p] - s[v] - 2 * sz[v] + su[p] + n;
  dsu[v] = anc[v] = v;
  used[v] = 1;
  for (auto i : edges[v])
    if (i != p) {
      cur[v] = i;
      dfs(i, v);
      unite(v, i, v);
    }
  for (auto it : q[v])
    if (used[it.first]) {
      long long a = it.first, b = v;
      long long lca = anc[get_dsu(a)];
      if (lca == b) continue;
      if (lca == a) {
        long long d = h[b] - h[a];
        double c = (n - sz[cur[a]]) * sz[b];
        ans[it.second] = (sz[b] * su[cur[a]] + s[b] * (n - sz[cur[a]])) / c + d;
      } else {
        long long d = h[b] + h[a] - 2 * h[lca];
        double c = sz[a] * sz[b];
        ans[it.second] = (s[a] * sz[b] + s[b] * sz[a]) / c + d + 1;
      }
    }
}
void smain() {
  for (long long u, v; cin >> n >> m;) {
    for (long long i = 0; i < n - 1; i++) {
      cin >> u >> v;
      edges[u].push_back(v);
      edges[v].push_back(u);
    }
    for (long long i = 0; i < m; i++) {
      cin >> u >> v;
      q[u].emplace_back(v, i);
      q[v].emplace_back(u, i);
    }
    dfs1(1);
    dfs(1);
    for (long long i = 0; i < m; i++) cout << ans[i] << '\n';
    return;
  }
}
