inlinevoidinit(int n = 45) { C[0][0] = 1; for (int i = 1; i <= n; ++i) { C[i][0] = 1; for (int j = 1; j <= i; ++j) C[i][j] = C[i - 1][j] + C[i - 1][j - 1]; } } }
usingnamespace MATH;
int N, M, ALL; int A[Maxn][Maxn]; int ecnt[Maxs];
inlinevoidprint(int x) { int buc[30]; buc[0] = 0; while (x) buc[++buc[0]] = x & 1, x >>= 1; for (int i = 1; i <= buc[0]; ++i) cout << buc[i]; for (int i = buc[0] + 1; i <= N; ++i) cout << 0; }
inlinevoidInit() { ALL = (1 << N) - 1;
for (int S = 0; S <= ALL; ++S) { for (int i = 1; i <= N; ++i) { if (S & (1 << (i - 1))) continue; int T = S | (1 << (i - 1)); ecnt[T] = ecnt[S]; for (int j = 1; j <= N; ++j) if (S & (1 << (j - 1))) ecnt[T] += A[i][j]; } } }
LL f[Maxs][Maxm], g[Maxs][Maxm];
inlinevoidSolve()// f : 不联通, g : 联通 { Init ();
for (int S = 0; S <= ALL; ++S) { if (__builtin_popcount (S) == 1) f[S][0] = 0, g[S][0] = 1;
int pos = 0; for (int j = 0; j < N; ++j) if (S & (1 << j)) pos = 1 << j;
for (int i = 0; i <= ecnt[S]; ++i) { g[S][i] = C[ecnt[S]][i]; for (int T = (S - 1) & S; T > 0; T = (T - 1) & S) { if (!(T & pos)) continue; for (int j = 0; j <= min (i, ecnt[T]); ++j) f[S][i] += g[T][j] * C[ecnt[S ^ T]][i - j]; } g[S][i] -= f[S][i]; } }
double ans = 0; for (int i = 0; i < M; ++i) ans += 1.0 * f[ALL][i] / C[M][i];
printf("%.6lf\n", ans / (M + 1)); }
inlinevoidInput() { N = read<int>(), M = read<int>(); for (int i = 1; i <= M; ++i) { int x = read<int>(), y = read<int>(); A[x][y] = A[y][x] = 1; } }