#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn=1e6+7;
const ll mod=1e9+7;
int read()
{
	int res=0,f=1;
	char c=getchar();
	while(c!='-' && !isdigit(c)) c=getchar();
	if(c=='-') f=-1,c=getchar();
	while(isdigit(c)) res=res*10+c-48,c=getchar();
	return res*f;
}
struct node
{
	int to,nt;
}e[maxn];
int cnt,head[maxn];
void add(int x,int y)
{
	cnt++;
	e[cnt].nt=head[x];
	e[cnt].to=y;
	head[x]=cnt;
}
struct eige
{
	int x,y;
}E[maxn];
int n,m,tot,ans;
int vis[maxn],Vis[maxn],viss[maxn];
void dfs(int x)
{
	if(vis[x]) tot++; viss[x]=1;
	for(int i=head[x];i;i=e[i].nt)
	{
		int to=e[i].to;
		if(viss[to]) continue;
		dfs(to);
	}
}
void dfs1(int x,int sum)
{
	if(x>m) 
	{
		for(int i=1;i<=n;i++) head[i]=0;
		cnt=0;
		for(int i=1;i<=m;i++)
			if(Vis[i])
			{
				int x=E[i].x,y=E[i].y;
				add(x,y); add(y,x);
			 } 
		int tp=0;tot=0;
		for(int i=1;i<=n;i++) 
		{
			viss[i]=0;
			if(vis[i]) tp=i;
		}
		dfs(tp);
		if(tot==sum) ans++;
//		else 
//		{
//			cout<<sum<<' '<<tot<<endl;
//			for(int i=1;i<=n;i++) printf("%d ",vis[i]); puts("");
//			for(int j=1;j<=m;j++) printf("%d ",Vis[j]); puts("-");
//		}
		return ;
	}
	Vis[x]=1;
	dfs1(x+1,sum);
	Vis[x]=0;
	dfs1(x+1,sum);
}
void dfs0(int x,int sum)
{
	if(x>n) 
	{
		if(sum==0) return ;
		dfs1(1,sum);
		return ;
	}
	vis[x]=1;
	dfs0(x+1,sum+1);
	vis[x]=0;
	dfs0(x+1,sum);
}
int main()
{
	freopen("barrack.in","r",stdin);
	freopen("barrack.out","w",stdout);
	n=read(),m=read();
	for(int i=1;i<=m;i++)
		E[i].x=read(),E[i].y=read();
	dfs0(1,0);
	printf("%d\n",ans);
	return 0;
}