#include<bits/stdc++.h>
#define int long long
#define maxn 105
using namespace std;
const int TT=1e9+7;
int n,m,f[maxn],fa[maxn],dep[maxn],s[maxn],lnk[maxn],nxt[maxn],son[maxn],tot,lca,Ans,X[maxn],Y[maxn],p[1000005],cnt,w[maxn][maxn];
bool vis[maxn],v[maxn];
inline int read(){
	int ret=0,f=1;char ch=getchar();
	while (ch<'0'||ch>'9'){if (ch=='-') f=-f;ch=getchar();}
	while (ch<='9'&&ch>='0') ret=ret*10+ch-'0',ch=getchar();
	return ret*f;
}
inline void add(int x,int y){nxt[++tot]=lnk[x],lnk[x]=tot,son[tot]=y;}
inline void Work(){
	
}
inline void dfs(int x){
	v[x]=1;
	for (int i=1;i<=n;i++) if (w[x][i]&&!v[i]) dfs(i);
}
inline int check(){
	for (int i=1;i<=n;i++) v[i]=0;
	for (int i=1;i<=n;i++) if (vis[i]){
		dfs(i);break;
	}
	for (int i=1;i<=n;i++) if (!v[i]&&vis[i]) return 0;
	return 1;
}
signed main(){
	freopen("barrack.in","r",stdin);
	freopen("barrack.out","w",stdout);
	n=read(),m=read();p[0]=1;
	for (int i=1;i<=m+1;i++) p[i]=p[i-1]*2%TT;
//	if (m==n-1){Work();return 0;}
	for (int i=1;i<=m;i++) X[i]=read(),Y[i]=read();
	for (int S=1;S<p[n];S++){
		for (int i=1;i<=n;i++){
			if (S&(1<<(i-1))) vis[i]=1;
			else vis[i]=0;
		}
		for (int s=0;s<p[m];s++){
			for (int i=1;i<=n;i++)
			for (int j=1;j<=n;j++) w[i][j]=0;
			for (int i=1;i<=m;i++) if (s&(1<<(i-1))) w[X[i]][Y[i]]=w[Y[i]][X[i]]=1;
			Ans+=check();
		}
	}
	printf("%lld",Ans);
	return 0;
}