#include<bits/stdc++.h>
#define LL long long
using namespace std;
inline LL read(){
	LL res=0,fl=1;
	char ch=getchar();
	while(!(ch>='0' && ch<='9')){
		if(ch=='-')fl=-1;
		ch=getchar();
	}
	while(ch>='0' && ch<='9')res=res*10+ch-'0',ch=getchar();
	return res*fl;
}
const LL N=5e5+5;
int n,m,ans=0,p[N];
bool chs[N],che[N];
struct Edge{
	int x,y;
}a[N];
vector<int> e[N];
inline int find(int x){
	if(p[x]==x)return x;
	return p[x]=find(p[x]);
}
inline bool Graph(int id){
	for(int i=1;i<=n;i++)p[i]=i;
	for(int i=1;i<=m;i++){
		if(i==id)continue;
		int x=a[i].x,y=a[i].y;
		int px=find(x),py=find(y);
		p[px]=py;
	}
	int po=0;
	for(int i=1;i<=n;i++){
		if(chs[i]){
			if(!po)po=find(i);
			else if(po!=find(i))return 1;
		}
	}
	if(!po)return 1;
	
	return 0;
}
inline int Check(){
	bool fl=0;
	for(int i=1;i<=n;i++)
		if(chs[i])fl=1;
	if(!fl)return 0;
	for(int i=1;i<=m;i++){
		if(che[i])continue;
		if(Graph(i))return 0;
	}
	return 1;
}
inline void dfs2(int x){
	if(x>m){
		int tmp=Check();
		ans+=tmp;
		return;
	}
	che[x]=1;
	dfs2(x+1);
	che[x]=0;
	dfs2(x+1);
}
inline void dfs1(int x){
	if(x>n){
		dfs2(1);
		return;
	}
	chs[x]=1;
	dfs1(x+1);
	chs[x]=0;
	dfs1(x+1);
}
int main(){
//	freopen(".in","r",stdin);
//	freopen(".out","w",stdout);
	n=read(),m=read();
	for(int i=1;i<=m;i++){
		int x,y;
		x=read(),y=read();
		e[x].push_back(y);
		e[y].push_back(x);
		a[i]={x,y};
	}
	dfs1(1);
	cout<<ans<<'\n';
	return 0;
}
