#include <bits/stdc++.h>
using namespace std;
long long gcd(long long a, long long b) { return b == 0 ? a : gcd(b, a % b); }
inline void readInt(int &x) {
  char c;
  while ((c = getchar()) < '0' || c > '9')
    ;
  x = (c ^ 48);
  while ('0' <= (c = getchar()) && c <= '9') {
    x = x * 10 + (c ^ 48);
  }
  return;
}
int root = 0;
int n, m;
struct LinkNode {
  int v, next;
} edge[200010];
int tot = 0, first[100010] = {};
inline void addedge(int u, int v) {
  ++tot;
  edge[tot].v = v;
  edge[tot].next = first[u];
  first[u] = tot;
  return;
}
int pa[20][100010], siz[100010], depth[100010];
long long dlens[100010], ulens[100010];
void dfs1(int x, int fa) {
  pa[0][x] = fa;
  siz[x] = 1;
  depth[x] = depth[fa] + 1;
  dlens[x] = 0;
  int y;
  for (int i = first[x]; i; i = edge[i].next) {
    y = edge[i].v;
    if (y != fa) {
      dfs1(y, x);
      siz[x] += siz[y];
      dlens[x] += dlens[y] + siz[y];
    }
  }
  return;
}
void dfs2(int x, int fa, long long s) {
  ulens[x] = s + n - siz[x];
  s = ulens[x] + dlens[x];
  int y;
  for (int i = first[x]; i; i = edge[i].next) {
    y = edge[i].v;
    if (y != fa) {
      dfs2(y, x, s - (dlens[y] + siz[y]));
    }
  }
  return;
}
inline bool isChild(int fa, int x) {
  for (int i = 19; i >= 0; --i) {
    if (depth[pa[i][x]] >= depth[fa]) {
      x = pa[i][x];
    }
  }
  return x == fa;
}
inline int wChild(int fa, int x) {
  for (int i = 19; i >= 0; --i) {
    if (depth[pa[i][x]] > depth[fa]) {
      x = pa[i][x];
    }
  }
  return x;
}
inline int lca(int x, int y) {
  if (depth[x] < depth[y]) {
    int t = x;
    x = y;
    y = t;
  }
  for (int i = 19; i >= 0; --i) {
    if (depth[pa[i][x]] >= depth[y]) {
      x = pa[i][x];
    }
  }
  if (x == y) {
    return x;
  }
  for (int i = 19; i >= 0; --i) {
    if (pa[i][x] != pa[i][y]) {
      x = pa[i][x];
      y = pa[i][y];
    }
  }
  return pa[0][x];
}
int main() {
  int a, b;
  long long ga, gb, g;
  readInt(n);
  readInt(m);
  for (int i = 1; i < n; ++i) {
    readInt(a);
    readInt(b);
    addedge(a, b);
    addedge(b, a);
  }
  srand((unsigned)(time(NULL)));
  root = ((long long)rand() * rand()) % n + 1;
  depth[0] = 0;
  dfs1(root, 0);
  dfs2(root, 0, 0);
  for (int i = 1; i < 20; ++i) {
    for (int j = 1; j <= n; ++j) {
      pa[i][j] = pa[i - 1][pa[i - 1][j]];
    }
  }
  while (m--) {
    readInt(a);
    readInt(b);
    if (isChild(b, a)) {
      int t = a;
      a = b;
      b = t;
    }
    if (isChild(a, b)) {
      int w = wChild(a, b);
      gb = (long long)(n - siz[w]) * siz[b];
      ga = (long long)(depth[b] - depth[a] + 1) * gb +
           (long long)(ulens[a] + dlens[a] - dlens[w] - siz[w]) * siz[b] +
           (long long)dlens[b] * (n - siz[w]);
    } else {
      int l = lca(a, b);
      gb = (long long)siz[a] * siz[b];
      ga = (long long)(depth[a] + depth[b] - 2 * depth[l] + 1) * gb +
           (long long)dlens[a] * siz[b] + (long long)dlens[b] * siz[a];
    }
    g = gcd(ga, gb);
    ga /= g, gb /= g;
    printf("%.8lf\n", (double)ga / gb);
  }
  return 0;
}
