#include <bits/stdc++.h>
using namespace std;
long long gcd(long long a, long long b) { return (a ? gcd(b % a, a) : b); }
void exgcd(long long a, long long b, long long& d, long long& x, long long& y) {
  if (!b) {
    d = a;
    x = 1;
    y = 0;
  } else {
    exgcd(b, a % b, d, y, x);
    y -= x * (a / b);
  }
}
long long power(long long a, long long n) {
  long long p = 1;
  while (n > 0) {
    if (n % 2) {
      p = p * a;
    }
    n >>= 1;
    a *= a;
  }
  return p;
}
long long power(long long a, long long n, long long mod) {
  long long p = 1;
  while (n > 0) {
    if (n % 2) {
      p = p * a;
      p %= mod;
    }
    n >>= 1;
    a *= a;
    a %= mod;
  }
  return p % mod;
}
double power(double a, long long n) {
  double p = 1.0;
  while (n > 0) {
    if (n % 2) {
      p = p * a;
    }
    n >>= 1;
    a *= a;
  }
  return p;
}
inline bool input(int& num) {
  char in;
  bool IsN = false;
  in = getchar();
  if (in == EOF) return false;
  while (in != '-' && (in < '0' || in > '9')) in = getchar();
  if (in == '-') {
    IsN = true;
    num = 0;
  } else
    num = in - '0';
  while (in = getchar(), in >= '0' && in <= '9') {
    num *= 10, num += in - '0';
  }
  if (IsN) num = -num;
  return true;
}
int inf = 0x3f3f3f3f, t1 = 277, t2 = 233, mod = 1e9 + 7;
const int maxn = 1e5 + 100;
const double PI = acos(-1.0);
int n, m;
int fa[maxn], ga[maxn];
int Find(int x) {
  if (fa[x] == x) return x;
  fa[x] = Find(fa[x]);
  return fa[x];
}
int Gind(int x) {
  if (ga[x] == x) return x;
  ga[x] = Gind(ga[x]);
  return ga[x];
}
vector<int> nex[maxn];
int flag[maxn];
long long son[maxn], pat[maxn], slen[maxn], fson[maxn], flen[maxn], ex[maxn];
int qu[maxn], qv[maxn], lca[maxn];
vector<int> que[maxn], id[maxn];
void dfs1(int x, int be) {
  flag[x] = 1;
  son[x] = 1;
  pat[x] = pat[be] + 1;
  for (int i = 0; i < nex[x].size(); i++)
    if (nex[x][i] != be) {
      dfs1(nex[x][i], x);
      fa[Find(nex[x][i])] = x;
      son[x] += son[nex[x][i]];
      slen[x] += son[nex[x][i]] + slen[nex[x][i]];
    }
  for (int i = 0; i < que[x].size(); i++)
    if (flag[que[x][i]] == 1) {
      if (lca[id[x][i]] == x) {
        ex[id[x][i]] = Gind(que[x][i]);
      }
      lca[id[x][i]] = Find(que[x][i]);
    }
  for (int i = 0; i < nex[x].size(); i++)
    if (nex[x][i] != be) ga[Gind(nex[x][i])] = x;
}
void dfs2(int x, int be) {
  long long lsum = 0, sson = 0;
  for (int i = 0; i < nex[x].size(); i++)
    if (nex[x][i] != be) {
      lsum += slen[nex[x][i]];
      sson += son[nex[x][i]];
    }
  for (int i = 0; i < nex[x].size(); i++)
    if (nex[x][i] != be) {
      fson[nex[x][i]] = fson[x] + 1 + sson - son[nex[x][i]];
      flen[nex[x][i]] = flen[x] + fson[x] + 1 + lsum - slen[nex[x][i]] +
                        2 * (sson - son[nex[x][i]]);
      dfs2(nex[x][i], x);
    }
}
int main() {
  int T, s, e;
  while (~scanf("%d%d", &n, &m)) {
    memset(son, 0, sizeof son);
    memset(slen, 0, sizeof slen);
    memset(ex, 0, sizeof ex);
    memset(flag, 0, sizeof flag);
    memset(lca, 0, sizeof lca);
    for (int i = 1; i <= n; i++) {
      nex[i].clear();
      que[i].clear();
      fa[i] = i;
      ga[i] = i;
    }
    for (int i = 1; i < n; i++) {
      int u, v;
      scanf("%d%d", &u, &v);
      nex[u].push_back(v);
      nex[v].push_back(u);
    }
    for (int i = 1; i <= m; i++) {
      scanf("%d%d", &qu[i], &qv[i]);
      que[qu[i]].push_back(qv[i]);
      que[qv[i]].push_back(qu[i]);
      id[qu[i]].push_back(i);
      id[qv[i]].push_back(i);
    }
    flen[1] = 0;
    fson[1] = 0;
    pat[0] = -1;
    dfs1(1, 0);
    dfs2(1, 0);
    for (int i = 1; i <= m; i++) {
      double ans = 0, len = pat[qu[i]] + pat[qv[i]] - 2 * pat[lca[i]];
      long long lu = 0, lv = 0, su = 0, sv = 0;
      if (ex[i] != 0) {
        int u, v;
        u = qu[i];
        v = qv[i];
        if (lca[i] == v) swap(v, u);
        su = son[u] + fson[u] - son[ex[i]];
        sv = son[v];
        lu = flen[u] + slen[u] - slen[ex[i]] - son[ex[i]];
        lv = slen[v];
        ans += (double)lu / (double)su;
        ans += (double)lv / (double)sv;
      } else {
        int u, v;
        u = qu[i];
        v = qv[i];
        su = son[u];
        sv = son[v];
        lu = slen[u];
        lv = slen[v];
        ans += (double)lu / (double)su;
        ans += (double)lv / (double)sv;
      }
      ans += 1. * len + 1.0;
      printf("%.10f\n", ans);
    }
  }
  return 0;
}
