#include <bits/stdc++.h>
#define ll long long
#define ull unsigned long long
#define init(x) memset (x,0,sizeof (x))
#define INF 0x3f3f3f3f
using namespace std;
const int MAX = 1e5 + 5;
const int MOD = 1e9 + 7;
inline int read ();
stack <int> s;
int n,m,cnt,times,scc_cnt;ll ans;
int scc[MAX],vis[MAX],head[MAX],to[MAX << 1],nxt[MAX << 1],dfn[MAX],low[MAX];
void add (int x,int y);
void tarjan (int u,int fa);
int main ()
{
	freopen ("barrack.in","r",stdin);
	freopen ("barrack.out","w",stdout);
	n = read ();m = read ();
	for (int i = 1;i <= m;++i)
	{
		int x = read (),y = read ();
		add (x,y);add (y,x);
	}
	for (int i = 1;i < (1 << n);++i)
	{
		for (int j = 1;j <= n;++j)
		{
			if (i & (1 << (j - 1))) vis[j] = 1;
			else vis[j] = 0;
			dfn[j] = low[j] = scc[j] = 0;
		}
		times = scc_cnt = 0;
		for (int j = 1;j <= n;++j)
		{
			if (!vis[j]) continue;
			if (!dfn[j]) tarjan (j,j);
		}
		ans += 1ll * (1 << (m - (scc_cnt - 1)));
	}
	printf ("%lld\n",ans);
	return 0;
}
inline int read ()
{
	int s = 0,f = 1;
	char ch = getchar ();
	while ((ch < '0' || ch > '9') && ch != EOF)
	{
		if (ch == '-') f = -1;
		ch = getchar ();
	}
	while (ch >= '0' && ch <= '9')
	{
		s = s * 10 + ch - '0';
		ch = getchar ();
	}
	return f * s;
}
void add (int x,int y)
{
	to[++cnt] = y;
	nxt[cnt] = head[x];
	head[x] = cnt;
}
void tarjan (int u,int fa)
{
	if (dfn[u]) return ;
	low[u] = dfn[u] = ++times;
	s.push (u);
	for (int i = head[u];i;i = nxt[i])
	{
		int v = to[i];
		if (!vis[v] || v == fa) continue;
		tarjan (v,u);
		if (low[v] <= dfn[v]) low[u] = min (low[u],low[v]);
		else if (!scc[v]) low[u] = min (low[u],dfn[v]);
	}
	if (low[u] == dfn[u])
	{
		++scc_cnt;
		while (1)
		{
			int x = s.top ();s.pop ();
			scc[x] = scc_cnt;
			if (x == u) break;
		}
	}
}
