#include <bits/stdc++.h>
using namespace std;
const long long MOD = 1000000007;
long long POW(long long a, long long b, long long MMM = MOD) {
  long long ret = 1;
  for (; b; b >>= 1, a = (a * a) % MMM)
    if (b & 1) ret = (ret * a) % MMM;
  return ret;
}
long long gcd(long long a, long long b) { return b ? gcd(b, a % b) : a; }
long long lcm(long long a, long long b) {
  if (a == 0 || b == 0) return a + b;
  return a * (b / gcd(a, b));
}
int dx[] = {0, 1, 0, -1, 1, 1, -1, -1}, dy[] = {1, 0, -1, 0, 1, -1, 1, -1};
int n, q;
pair<long long, long long> down[100001], up[100001];
int parent[100001][17], depth[100001];
vector<int> v[100001];
void dfs1(int N, int p, int d) {
  down[N].second++;
  depth[N] = d;
  parent[N][0] = p;
  for (int next : v[N]) {
    if (next == p) continue;
    dfs1(next, N, d + 1);
    down[N].first += down[next].first;
    down[N].second += down[next].second;
  }
  down[N].first += down[N].second - 1;
}
void dfs2(int N, int p, long long d) {
  up[N].first = d;
  long long t = 0;
  for (int next : v[N]) {
    if (next == p) continue;
    dfs2(next, N,
         d + down[N].first - down[next].first - down[next].second +
             up[next].second - 1);
  }
}
int LCA(int x, int y) {
  if (depth[x] < depth[y]) swap(x, y);
  int dif = depth[x] - depth[y];
  for (int j = 0; dif > 0; j++) {
    if (dif & 1) x = parent[x][j];
    dif /= 2;
  }
  if (x != y) {
    for (int(j) = (16); (j) >= (0); (j) -= (1)) {
      if (parent[x][j] != -1 && parent[x][j] != parent[y][j]) {
        x = parent[x][j];
        y = parent[y][j];
      }
    }
    x = parent[x][0];
  }
  return x;
}
int under(int x, int y) {
  if (parent[x][0] == y) return x;
  int t = depth[x] - depth[y] - 1;
  for (int(i) = (16); (i) >= (0); (i) -= (1)) {
    if (t & (1 << i)) x = parent[x][i];
  }
  return x;
}
inline int dist(int x, int y, int u) {
  return depth[x] + depth[y] - 2 * depth[u];
}
int main() {
  memset((parent), -1, sizeof(parent));
  ;
  scanf("%d%d", &n, &q);
  for (int(i) = (1); (i) <= (n - 1); (i) += (1)) {
    int x, y;
    scanf("%d%d", &x, &y);
    v[x].push_back(y);
    v[y].push_back(x);
  }
  dfs1(1, -1, 0);
  for (int(i) = (1); (i) <= (n); (i) += (1))
    up[i].second = n - down[i].second + 1;
  dfs2(1, -1, 0);
  for (int(j) = (0); (j) <= (15); (j) += (1))
    for (int(i) = (1); (i) <= (n); (i) += (1))
      if (parent[i][j] != -1) parent[i][j + 1] = parent[parent[i][j]][j];
  while (q--) {
    int x, y;
    scanf("%d%d", &x, &y);
    if (depth[x] < depth[y]) swap(x, y);
    int u = LCA(x, y);
    if (u == y) {
      pair<long long, long long> UP = up[y];
      int xx = under(x, y);
      UP.first += down[y].first - down[xx].first - down[xx].second;
      UP.second += down[y].second - down[xx].second - 1;
      long long cnt = down[x].second * UP.second;
      long long d = cnt * (dist(x, y, u) + 1) + down[x].first * UP.second +
                    down[x].second * UP.first;
      printf("%.10f\n", 1.0 * d / cnt);
    } else {
      long long cnt = down[x].second * down[y].second;
      long long d = cnt * (dist(x, y, u) + 1) + down[x].first * down[y].second +
                    down[x].second * down[y].first;
      printf("%.10f\n", 1.0 * d / cnt);
    }
  }
}
