#include<bits/stdc++.h>
#define int long long
#define F(i,j,k) for(register int i=j,_End=k;i<=_End;i++)
#define D(i,j,k) for(register int i=j,_End=k;i>=_End;i--)
#define N 1000005
using namespace std;

inline void ri(int &x)
{
	x=0;
	char c=getchar();
	while(c<48||c>57)	c=getchar();
	while(c>47&&c<58)	x=x*10+c-48,c=getchar();
}

int n,m,i,j,k,ans,x[N],y[N],re[N],f[3005][3005];

void dfs(int u)
{
	re[u]=1;
	F(i,1,n)
	{
		if(u==i||re[i]==1||f[u][i]==-1)	continue;
		if(max(i,u)==max(x[k],y[k])&&min(i,u)==min(x[k],y[k])&&(j&(1<<(k-1)))==0)	continue;
		dfs(i);
	}
}

signed main()
{
	freopen("barrack.in","r",stdin);
	freopen("barrack.out","w",stdout);
	ri(n),ri(m);
	F(i,1,n)	F(j,1,n)	f[i][j]=-1;
	F(i,1,m)	ri(x[i]),ri(y[i]),f[x[i]][y[i]]=f[y[i]][x[i]]=1;
	for(i=1;i<(1<<n);i++)
	{
		for(j=0;j<(1<<m);j++)
		{
			int flag=1;
			for(k=1;k<=m;k++)
			{
				F(l,1,n)	re[l]=-1;
//				cout<<log2(i&-i)+1<<' '<<i<<endl;
				dfs(log2(i&-i)+1);
//				F(l,1,n)	cout<<re[l]<<' ';
//				cout<<endl;
				F(l,1,n)
				{
					if((1<<(l-1))&i&&re[l]==-1)
					{
//						cout<<l<<' '<<i<<'*'<<endl;
						flag=0;
						break;
					}
				}
				if(flag==0)	break;
			}
//			if(flag)	cout<<i<<' '<<j<<endl;
			ans+=flag;
		}
	}
	printf("%lld",ans);
	return 0;
}
