#include<bits/stdc++.h>
using namespace std;
const int mod=1e9+7,N=110;
int ans,f[N],u[N],v[N],bkpos[N],bke[N],n,m;
int read(){
	int x=0,f=1;char c=getchar();
	while(c>'9' || c<'0'){if(c=='-')f=-1;c=getchar();}
	while(c>='0' && c<='9'){x=(x<<1)+(x<<3)+(c^48);c=getchar();}
	return x*f;
}
int zx(int u){
	if(u==f[u])return u;
	return f[u]=zx(f[u]);
}
void check(){
//	bkpos[1]=bkpos[2]=1;bke[1]=0;
	//dfsg
	
	bool flag=0;
	for(int i=1;i<=n;i++)if(bkpos[i])flag=1;
	if(!flag)return;
	
	for(int d=1;d<=m;d++){
		if(bke[d])continue;
		for(int i=1;i<=n;i++)f[i]=i;
		for(int i=1;i<=m;i++)
			if(i!=d)f[zx(u[i])]=zx(v[i]);
		int cnt=0;
		for(int i=1;i<=n;i++)
			if(bkpos[i]){
				if(!cnt)cnt=zx(i);
				else if(zx(i)!=cnt)return;
//				cout<<f[i]<<endl;
			}
	}
	ans++;
	return;
}
void dfs2(int now){
	if(now==m+1){check();return;}
	bke[now]=1;dfs2(now+1);
	bke[now]=0;dfs2(now+1);
	return;
}
void dfs(int now){
	if(now==n+1){dfs2(1);return;}
	bkpos[now]=1;dfs(now+1);
	bkpos[now]=0;dfs(now+1);
	return;
}
int main(){
	freopen("barrack.in","r",stdin);
	freopen("barrack.out","w",stdout);
	n=read(),m=read();
	for(int i=1;i<=m;i++)u[i]=read(),v[i]=read();
	dfs(1);//check();
	printf("%d",ans);
	return 0;
}