#include<cstdio>
#include<cctype>
#include<queue>
#include<cmath>
#include<cstring>
#include<algorithm>
#define rep(i,s,t) for(int i=s;i<=t;i++)
#define dwn(i,s,t) for(int i=s;i>=t;i--)
#define ren for(int i=first[x];i;i=next[i])
using namespace std;
inline int read() {
int x=0,f=1;char c=getchar();
for(;!isdigit(c);c=getchar()) if(c==‘-‘) f=-1;
for(;isdigit(c);c=getchar()) x=x*10+c-‘0‘;
return x*f;
}
const int maxn=11;
const int maxm=50;
typedef long long ll;
ll f[1<<maxn][maxm],dp[maxm],C[maxm][maxm];
int n,m,e[maxn],g[1<<maxn],cnt[1<<maxn];
int main() {
C[0][0]=1;
rep(i,1,49) {
C[i][0]=C[i][i]=1;
rep(j,1,i-1) C[i][j]=C[i-1][j-1]+C[i-1][j];
}
n=read();m=read();
rep(i,1,m) {
int u=read()-1,v=read()-1;
e[u]|=(1<<v);e[v]|=(1<<u);
}
rep(S,0,(1<<n)-1) rep(i,0,n-1) if(S>>i&1) cnt[S]++;
rep(S,0,(1<<n)-1) {
rep(i,0,n-1) if(S>>i&1) g[S]+=cnt[S&e[i]];
g[S]>>=1;
}
rep(S,1,(1<<n)-1) {
int c;
rep(i,0,n-1) if(S>>i&1) {c=i;break;}
if(cnt[S]==1) f[S][0]=1;
else for(int S2=(S-1)&S;S2;S2=(S2-1)&S) if(S2>>c&1) {
rep(i,0,g[S2]) rep(j,0,g[S^S2]) dp[i+j]+=f[S2][i]*C[g[S^S2]][j];
}
rep(i,0,g[S]) f[S][i]=C[g[S]][i]-dp[i],dp[i]=0;
}
double ans=0.0;
rep(i,0,m) ans+=1.0-(double)f[(1<<n)-1][i]/C[m][i];
printf("%.6lf\n",ans/(m+1));
return 0;
}