#include<bits/stdc++.h>
#define LL unsigned long long
using namespace std;
const int maxn=505;
const int maxe=2005;
bitset<20>b;
struct node{
	int u,v;
}e[maxe];
LL p[maxn];
int n,m,x;
LL ans;
int id[55],fa[maxn];
//void add(int u,int v,int id)
//{
//	edge[++tot].to=v;
//	edge[tot].id=id;
//	edge[tot].nxt=head[u];
//	head[u]=tot;
//}
int findfa(int x){return fa[x]==x?x:fa[x]=findfa(fa[x]);}
void rd(int &rex)
{
	char c=getchar();int f=1;rex=0;
	while(c<'0'||c>'9')c=='-'&&(f=-1),c=getchar();
	while(c>='0'&&c<='9')rex=rex*10+c-'0',c=getchar();
	rex*=f;
}
bool work(int k)
{
	for(int i=1;i<=n;i++)fa[i]=i;
	for(int i=1;i<=n;i++)
	if(i!=k)fa[findfa(e[i].u)]=findfa(e[i].v);
	for(int i=1;i<=n;i++)findfa(i);
	for(int i=1;i<id[0];i++)if(fa[id[i]]!=fa[id[i+1]])return 0;
	return 1;
}
int main()
{
	freopen("barrack.in","r",stdin); freopen("barrack.out","w",stdout);
	rd(n);rd(m);
	for(int i=1;i<=m;i++)rd(e[i].u),rd(e[i].v);
	while(!b[n])
	{
		id[0]=0;
		int cnt=0;
		if(b.count()==n)break;
		for(int i=1;i<=n;i++)if(!b[i-1])id[++id[0]]=i;
		for(int i=1;i<=m;i++)cnt+=work(i);
		ans+=1<<cnt;
		b=++x;
	}
	printf("%lld",ans);
	return 0;
}/*4 4
1 2
2 3
3 1
1 4

*/