#include <bits/stdc++.h>
using namespace std;
template <class X, class Y>
void minimize(X &x, const Y &y) {
  if (x > y) x = y;
}
template <class X, class Y>
void maximize(X &x, const Y &y) {
  if (x < y) x = y;
}
vector<int> adj[100100];
int par[100100][17 + 1], high[100100], numChild[100100];
long long sumHigh[100100], sumDis[100100];
int n, q;
void loadTree(void) {
  scanf("%d%d", &n, &q);
  for (int love = 0, _n = (n - 1); love < _n; love = love + 1) {
    int u, v;
    scanf("%d%d", &u, &v);
    adj[u].push_back(v);
    adj[v].push_back(u);
  }
  high[0] = -1;
}
void dfs(int u) {
  sumHigh[u] = high[u];
  numChild[u] = 1;
  for (__typeof((adj[u]).begin()) it = (adj[u]).begin(); it != (adj[u]).end();
       it++)
    if (*it != par[u][0]) {
      int v = *it;
      par[v][0] = u;
      high[v] = high[u] + 1;
      dfs(v);
      sumHigh[u] += sumHigh[v];
      numChild[u] += numChild[v];
    }
}
void DFS(int u) {
  for (__typeof((adj[u]).begin()) it = (adj[u]).begin(); it != (adj[u]).end();
       it++)
    if (*it != par[u][0]) {
      int v = *it;
      sumDis[v] = sumDis[u] + n - 2 * numChild[v];
      DFS(v);
    }
}
void setupLCA(void) {
  dfs(1);
  for (int i = (1), _b = (n); i <= _b; i = i + 1) sumDis[1] += high[i];
  DFS(1);
  for (int j = (1), _b = (17); j <= _b; j = j + 1)
    for (int i = (1), _b = (n); i <= _b; i = i + 1)
      par[i][j] = par[par[i][j - 1]][j - 1];
}
int jump(int u, int h) {
  for (int i = (17), _a = (0); i >= _a; i = i - 1)
    if ((1LL << (i)) <= h) {
      u = par[u][i];
      h -= (1LL << (i));
    }
  return (u);
}
int LCA(int u, int v) {
  if (high[v] > high[u]) return (LCA(v, u));
  for (int i = (17), _a = (0); i >= _a; i = i - 1)
    if (high[par[u][i]] >= high[v]) u = par[u][i];
  if (u == v) return (u);
  for (int i = (17), _a = (0); i >= _a; i = i - 1)
    if (par[u][i] != par[v][i]) {
      u = par[u][i];
      v = par[v][i];
    }
  return (par[u][0]);
}
double query(int u, int v) {
  int w = LCA(u, v);
  if (w != u && w != v)
    return (1.0 * sumHigh[u] / numChild[u] + 1.0 * sumHigh[v] / numChild[v] -
            2 * high[w] + 1);
  if (w == v) return (query(v, u));
  int t = jump(v, high[v] - high[u] - 1);
  long long sumU = sumDis[u] - (sumHigh[t] - 1LL * high[u] * numChild[t]);
  int numU = n - numChild[t];
  return (1.0 * sumU / numU + 1.0 * sumHigh[v] / numChild[v] - high[u] + 1);
}
void process(void) {
  for (int love = 0, _n = (q); love < _n; love = love + 1) {
    int u, v;
    scanf("%d%d", &u, &v);
    printf("%.10000lf\n", query(u, v));
  }
}
int main(void) {
  loadTree();
  setupLCA();
  process();
  return 0;
}
