#include <bits/stdc++.h>
namespace IO {
char buf[1 << 20 | 1], *f1 = buf, *f2 = buf, pbuf[1 << 24 | 1], *f3 = pbuf,
                       sta[100];
inline int read() {
  int x = 0, f = 1;
  char ch = getchar();
  while (ch < '0' || ch > '9') {
    if (ch == '-') f = -1;
    ch = getchar();
  }
  while (ch >= '0' && ch <= '9') {
    x = (x << 3) + (x << 1) + (ch ^ 48);
    ch = getchar();
  }
  return x * f;
}
template <class T>
inline void write(T x) {
  if (!x) return (void)(*f3++ = 48, *f3++ = ' ');
  if (x < 0) *f3++ = '-', x = ~x + 1;
  char *top = sta;
  while (x) *top++ = x % 10 + 48, x /= 10;
  while (top != sta) *f3++ = *--top;
  *f3++ = ' ';
}
inline void put(std::string s) {
  int len = s.length();
  for (int i = 0; i < len; i++) *f3++ = s[i];
  *f3++ = ' ';
}
inline void endline() { *f3++ = '\n'; }
template <class T>
inline T abs(T a) {
  return a < 0 ? -a : a;
}
template <class T>
inline T max(T a, T b) {
  return a > b ? a : b;
}
template <class T>
inline T min(T a, T b) {
  return a < b ? a : b;
}
template <class T>
inline void swap(T &a, T &b) {
  T t = a;
  a = b;
  b = t;
}
}  // namespace IO
using namespace IO;
const int N = 1e5 + 5;
int n, m;
int fa[N][20], size[N], dep[N];
long long sum[N], s[N];
struct Edge {
  int to;
  Edge *nxt;
  Edge(int to = 0, Edge *nxt = NULL) : to(to), nxt(nxt) {}
} * head[N], pool[N << 1], *tail = pool;
inline void add(int u, int v) { head[u] = new (tail++) Edge(v, head[u]); }
void get_tree(int x) {
  dep[x] = dep[fa[x][0]] + 1;
  size[x] = 1;
  for (int i = 1; i <= 19; i++) fa[x][i] = fa[fa[x][i - 1]][i - 1];
  for (Edge *i = head[x]; i; i = i->nxt) {
    int to = i->to;
    if (to == fa[x][0]) continue;
    fa[to][0] = x;
    get_tree(to);
    size[x] += size[to];
    sum[x] += sum[to] + size[to];
  }
}
void dfs(int x) {
  for (Edge *i = head[x]; i; i = i->nxt) {
    int to = i->to;
    if (to == fa[x][0]) continue;
    s[to] = s[x] + sum[x] - sum[to] - size[to] + n - size[to];
    dfs(to);
  }
}
inline int LCA(int x, int y) {
  if (dep[x] < dep[y]) swap(x, y);
  for (int i = 19; i >= 0; i--)
    if (dep[fa[x][i]] >= dep[y]) x = fa[x][i];
  if (x == y) return x;
  for (int i = 19; i >= 0; i--)
    if (fa[x][i] != fa[y][i]) x = fa[x][i], y = fa[y][i];
  return fa[x][0];
}
inline int find(int x, int y) {
  for (int i = 19; i >= 0; i--)
    if (dep[fa[fa[x][i]][0]] >= dep[y]) x = fa[x][i];
  return x;
}
inline int Dis(int x, int y) { return dep[x] + dep[y] - (dep[LCA(x, y)] << 1); }
int main() {
  n = read();
  m = read();
  for (int i = 1, u, v; i < n; i++)
    u = read(), v = read(), add(u, v), add(v, u);
  get_tree(1);
  dfs(1);
  while (m-- > 0) {
    int x = read(), y = read(), lca = LCA(x, y);
    double ans = 0;
    if (dep[x] < dep[y]) swap(x, y);
    if (lca == y) {
      int w = find(x, y);
      ans = dep[x] - dep[w] + 1 + (double)sum[x] / (double)size[x] +
            (double)s[w] / (double)(n - size[w]);
    } else {
      ans = (double)sum[x] / (double)size[x] +
            (double)sum[y] / (double)size[y] + Dis(x, y) + 1;
    }
    printf("%.8f\n", ans);
  }
  return 0;
}
