#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10, lg = 20, inf = 1e9;
int n, q, timer;
int par[lg][N], h[N], sz[N], st[N], ft[N];
long long subtreedissum[N], notsubtreedissum[N];
vector<int> adj[N];
void DFSdown(int u, int pr = 0) {
  st[u] = timer++;
  sz[u] = 1;
  par[0][u] = pr;
  for (int i = 1; i < lg; i++) par[i][u] = par[i - 1][par[i - 1][u]];
  for (auto v : adj[u]) {
    if (v == pr) continue;
    h[v] = h[u] + 1;
    DFSdown(v, u);
    sz[u] += sz[v];
    subtreedissum[u] += (subtreedissum[v] + sz[v]);
  }
  ft[u] = timer++;
}
void DFSup(int u, int pr = 0) {
  for (auto v : adj[u]) {
    if (v == pr) continue;
    notsubtreedissum[v] = notsubtreedissum[u] + (n - sz[u]) + subtreedissum[u] -
                          (subtreedissum[v] + sz[v]);
    DFSup(v, u);
  }
}
int jump(int u, int d) {
  for (int i = lg - 1; i >= 0; i--) {
    if ((d >> i) & 1) u = par[i][u];
  }
  return u;
}
int LCA(int u, int v) {
  if (h[u] > h[v]) swap(u, v);
  v = jump(v, h[v] - h[u]);
  if (u == v) return v;
  for (int i = lg - 1; i >= 0; i--) {
    if (par[i][u] != 0 && par[i][v] != 0 && par[i][u] != par[i][v]) {
      u = par[i][u];
      v = par[i][v];
    }
  }
  return par[0][u];
}
int dis(int u, int v) { return h[u] + h[v] - 2 * h[LCA(u, v)]; }
bool checkispar(int u, int v) { return st[v] >= st[u] && ft[v] <= ft[u]; }
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  cin >> n >> q;
  for (int i = 1; i < n; i++) {
    int u, v;
    cin >> u >> v;
    adj[u].push_back(v);
    adj[v].push_back(u);
  }
  DFSdown(1);
  DFSup(1);
  cout << fixed << setprecision(6);
  while (q--) {
    int u, v;
    cin >> u >> v;
    if (checkispar(u, v) || checkispar(v, u)) {
      if (h[u] > h[v]) swap(u, v);
      double tmp =
          (double)(subtreedissum[v] * 1.0000000000 / sz[v]) + 1 + dis(u, v);
      u = jump(v, h[v] - h[u] - 1);
      tmp += (double)(notsubtreedissum[u] * 1.0000000000 / (n - sz[u]));
      cout << tmp << "\n";
      continue;
    }
    double tmp = (double)(subtreedissum[v] * 1.0000000000 / sz[v]) +
                 (double)(subtreedissum[u] * 1.0000000000 / sz[u]) + 1 +
                 dis(u, v);
    cout << tmp << "\n";
  }
}
