#include <cstdio>

#define rep(i,j,k) for (int (i)=(j);(i)<=(k);++(i))

using namespace std;

typedef long double ld;

const int N=10,M=N*(N-1)/2,maxS=1<<N;

int n,m,all,cnt[maxS+10];
ld ans,fac[M+10],C[M+10][M+10],f[maxS+10][M+10],g[maxS+10][M+10];

int main(){
	/*
	 * f[S][i]: status is S, the rank of the maximum edge of the graph is i
	 * f[S][i] = sigma(
				g[T][j] * g[S - T][i - j - 1]
				* C(i - 1, j)
				* C(cnt[S] - i, cnt[T] - j)
				* C((cnt[S] - i) - (cnt[T] - j), cnt[S - T] - (i - j - 1))
				* (cnt[S] - cnt[T] - cnt[S - T])!
			)
	 * g[S][i] = sigma(f[S][1 .. i])
	 */
	scanf("%d%d",&n,&m);
	all=1<<n;
	rep(i,1,m){
		int x,y;
		scanf("%d%d",&x,&y);
		x--; y--;
		rep(j,0,all-1) if ((j>>x&1) && (j>>y&1)) cnt[j]++;
	}
	rep(i,0,m) fac[i]=i?fac[i-1]*i:1;
	rep(i,0,m) rep(j,0,i) C[i][j]=j?C[i-1][j-1]+C[i-1][j]:1;
	rep(S,1,all-1) rep(i,0,cnt[S]){
		if (S==(S&-S)){
			f[S][i]=g[S][i]=1;
			continue;
		}
		for (int S0=S-(S&-S),T=S0;T;T=T-1&S0) rep(j,0,i-1) if (j<=cnt[T] && i-j-1<=cnt[S-T]){
			ld t=g[T][j]*g[S-T][i-j-1];
			t*=C[i-1][j];
			t*=C[cnt[S]-i][cnt[T]-j];
			t*=C[cnt[S]-i-(cnt[T]-j)][cnt[S-T]-(i-j-1)];
			t*=fac[cnt[S]-cnt[T]-cnt[S-T]];
			f[S][i]+=t;
		}
		if (i) g[S][i]=g[S][i-1]+f[S][i];
	}
	rep(i,0,m) ans+=f[all-1][i]*i;
	ans/=(m+1)*fac[m];
	printf("%.6lf\n",(double)ans);
	return 0;
}