#include <bits/stdc++.h>
const double PI = acos(-1);
using namespace std;
const int MAX = 100 * 1000 + 10, MAXLG = 20;
vector<int> G[MAX];
int siz[MAX], depth[MAX], dfs_in[MAX], dfs_out[MAX], dfs_time, P[MAX][MAXLG], n,
    m;
long long sum_dist[MAX], sum_dist_up[MAX];
void dfs(int u, int p) {
  depth[u] = depth[p] + 1;
  dfs_in[u] = dfs_time++;
  P[u][0] = p;
  for (int i = 0; i < (MAXLG - 1); i++) P[u][i + 1] = P[P[u][i]][i];
  siz[u] = 1;
  for (int v : G[u])
    if (v != p) {
      dfs(v, u);
      siz[u] += siz[v];
      sum_dist[u] += sum_dist[v] + siz[v];
    }
  dfs_out[u] = dfs_time - 1;
}
bool inSubTree(int a, int b) {
  return dfs_in[b] <= dfs_in[a] && dfs_in[a] <= dfs_out[b];
}
int lca(int a, int b) {
  if (depth[a] > depth[b]) swap(a, b);
  if (inSubTree(b, a)) return a;
  int k = MAXLG - 1;
  while (a != b) {
    if (depth[a] > depth[b]) swap(a, b);
    while (k && inSubTree(a, P[b][k])) k--;
    b = P[b][k];
  }
  return a;
}
void dfs(int u, int p, long long from_parent) {
  sum_dist_up[u] = from_parent;
  long long tot = sum_dist[u] + from_parent;
  for (int v : G[u])
    if (v != p) {
      long long contrib = sum_dist[v] + siz[v];
      long long give = tot - contrib + n - siz[v];
      dfs(v, u, give);
    }
}
int get(int u, int d) {
  int k = 0;
  while (d) {
    int r = ((d) & (-(d)));
    while (r != (1 << k)) k++;
    u = P[u][k];
    d ^= r;
  }
  return u;
}
int main() {
  scanf("%d %d", &n, &m);
  for (int i = 0; i < (n - 1); i++) {
    int a, b;
    scanf("%d %d", &a, &b);
    G[a].push_back(b);
    G[b].push_back(a);
  }
  dfs(1, 0);
  dfs_out[0] = n;
  dfs(1, 0, 0);
  while (m--) {
    int a, b;
    scanf("%d %d", &a, &b);
    if (depth[a] > depth[b]) swap(a, b);
    int p = lca(a, b);
    if (a == p) {
      double ans = depth[b] - depth[a] + 1;
      int pp = get(b, depth[b] - depth[a] - 1);
      long long A = sum_dist[a] + sum_dist_up[a] - sum_dist[pp] - siz[pp];
      ans += A / (n - siz[pp] + 0.0) + sum_dist[b] * 1.0 / siz[b];
      printf("%.10f\n", ans);
    } else {
      double ans = depth[a] + depth[b] - 2 * depth[p] + 1;
      ans += sum_dist[a] * 1.0 / siz[a] + sum_dist[b] * 1.0 / siz[b];
      printf("%.10f\n", ans);
    }
  }
  return 0;
}
