#include<cstdio>
#include<algorithm>
#define LL long long
#define MOD 1000000007
//1.long long 2.1ll 3.%lld 4.xiabiao
using namespace std;
const LL MAXN=500005,MAXM=1000005;
inline long long rd()
{
	char ch=getchar();
	long long f=1ll,s=0;
	while(ch>'9' || ch<'0')
	{
		if(ch=='-')
			f=-1ll;
		ch=getchar();
	}
	while(ch<='9' && ch>='0')
	{
		s=(s<<3)+(s<<1)+ch-48;
		ch=getchar();
	}
	return s*f;
}
struct edgenode
{
	LL to,next;
}e[MAXM],e2[MAXM];
LL cnt,head[MAXN],head2[MAXN],dfn[MAXN],n,m,low[MAXN],vistar[MAXN],vistar2[MAXN],gen,fath[MAXN],bval[MAXN],dval[MAXN],dp[MAXN][3];
bool vist[MAXN];
void add(LL tu,LL tv)
{
	e[++cnt].to=tv;
	e[cnt].next=head[tu];
	head[tu]=cnt;
}

void add2(LL tu,LL tv)
{
	e2[++cnt].to=tv;
	e2[cnt].next=head2[tu];
	head2[tu]=cnt;
//	printf("%lld->%lld\n",tu,tv);
}
void dfsxu(LL now)
{
	dfn[now]=++cnt;
	for(int i=head[now];i;i=e[i].next)
	{
		if(!dfn[e[i].to])
		{

			dfsxu(e[i].to);
		}
	}
}



void dfstarjan(LL now,LL fa)
{
	
//	vistar2[now]=gen;
	for(int i=head[now];i;i=e[i].next)
	{
		
		if(e[i].to!=fa)
		{
//			if(vistar2[now]!=gen)
			{
				if(low[e[i].to]==0)
				{
					low[e[i].to]=dfn[e[i].to];
					dfstarjan(e[i].to,now);
//					low[now]=min(low[now],dfn[e[i].to]);
				}
				low[now]=min(low[now],low[e[i].to]);
//				else low[now]=min(low[now],dfn[e[i].to]);
			}
			
			
		}
	}
}
void tarjan(LL now,LL fa)
{
	vistar[now]=1;
	low[now]=dfn[now];
	gen=now;
	dfstarjan(now,fa);
	for(int i=head[now];i;i=e[i].next)
	{
		if(!vistar[e[i].to])
			tarjan(e[i].to,now);
	}
}

void treedp(LL now)
{
//	dp[i][0]=omega(dp[v][0]*2)
//	dp[i][1]=omega(dp[v][1]+2*dp[v][0])
	dp[now][0]=bval[now];
	dp[now][1]=dval[now]*bval[now];
	for(int i=head2[now];i;i=e2[i].next)
	{
		int V=e2[i].to;
		treedp(V);
//		dp[now][0]*=dp[V][0]*2;
//		dp[now][1]*=dp[V][1]+2*dp[V][0];

		dp[now][0]*=dp[V][0]*2;
		dp[now][1]*=(dp[V][0]+dp[V][2]*2);
//		dp[now][1]*=dp[V][1]*2-dp[V][0];
	}
	dp[now][2]=2*dp[now][1]-dp[now][0];
}
int main()
{
//	freopen("barrack.in","r",stdin);
//	freopen("barrack.out","w",stdout);
	n=rd();m=rd();
	for(int i=1;i<=m;i++)
	{
		LL tu,tv;
		tu=rd();tv=rd();
		add(tu,tv);
		add(tv,tu);
	}
	cnt=0;
	dfsxu(1);
//	for(int i=1;i<=n;i++)
//		printf("%lld ",dfn[i]);
//		printf("\n\n");

	tarjan(1,0);
	
//		for(int i=1;i<=n;i++)
//  printf("%lld ",low[i]);


	for(int i=1;i<=n;i++)
		bval[i]=dval[i]=1;
		
	cnt=1;
  	for(int i=1;i<=n;i++)
	{
		for(int j=head[i];j;j=e[j].next)
		{
			int V=e[j].to;
			if(low[V]==low[i])
			{
				if(V>i)
					bval[low[V]]*=2;//bian
				if(!vist[V])
				{
					dval[low[V]]*=2;//dian
					vist[V]=1;
				}
			}else
			{
				if(low[V]<low[i])
					add2(low[V],low[i]);
			}
		}
	}
	
	treedp(1);
	printf("%lld\n",dp[cnt-1][2]);
	return 0;
//  	for(int i=1;i<=n;i++)
//  		printf("%lld ",val[i]);
}