#include<bits/stdc++.h>
using namespace std;
const long long mod=1e9+7;
long long a,b,q,w,o,h[1000001],dfn[1000001],low[1000001],cnt,st[1000001],cn,bl[1000001],cnn,cn1,dp[500001][3],si[1000001],pw2,pw[1000001];
vector<long long> qu[1000001];
struct p{long long q,w;}l[2000001],stt[2000001];
void add(long long qq,long long ww){l[++o].q=ww,l[o].w=h[qq],h[qq]=o;}
long long pow_(long long qq,long long ww){long long ee=1;while(ww){if(ww&1) ee*=qq,ee%=mod;qq*=qq,qq%=mod,ww>>=1;}return ee%mod;}
void dfs(long long qq,long long ww)
{
	dfn[qq]=low[qq]=++cnt;st[++cn]=qq;
	for(int i=h[qq];i;i=l[i].w)
	{
		if(l[i].q!=ww)
		{
			if(!dfn[l[i].q])
			{
				dfs(l[i].q,qq);
				low[qq]=min(low[qq],low[l[i].q]);
			}
			else if(!bl[l[i].q]) low[qq]=min(low[qq],dfn[l[i].q]);
		}
	}
	if(dfn[qq]==low[qq])
	{
		++cnn;bl[qq]=cnn;qu[cnn].push_back(qq);si[cnn]++;
		while(st[cn]!=qq) bl[st[cn]]=cnn,qu[cnn].push_back(st[cn]),si[cnn]++,--cn;--cn;
	}
}
map<long long,bool> ve[1000001];
void dfs1(long long qq,long long ww)
{
	dp[qq][1]=pw[si[qq]];dp[qq][2]=pw[si[qq]]-1;
	bool fl=0;
	for(int i=h[qq];i;i=l[i].w)
	{
		if(l[i].q!=ww)
		{
			fl=1;
			dfs1(l[i].q,qq);
			dp[qq][2]=dp[qq][2]*(dp[l[i].q][1]*pw2%mod+pw2)%mod;
			dp[qq][1]=dp[qq][1]*(dp[l[i].q][1]*pw2%mod+pw2)%mod;
		}
	}
	long long tt=1;fl=0;
	for(int i=h[qq];i;i=l[i].w)
	{
		if(l[i].q!=ww)
		{
			fl=1;
			tt=tt*(dp[l[i].q][2])%mod;
		}
	}
	dp[qq][2]+=tt,dp[qq][2]%=mod;
}
int main()
{
	freopen("barrack.in","r",stdin);
	freopen("barrack.out","w",stdout);
	scanf("%lld%lld",&a,&b);
	pw[0]=1;for(int i=1;i<=1000000;i++) pw[i]=pw[i-1]*2%mod;
	for(int i=1;i<=b;i++) scanf("%lld%lld",&q,&w),add(q,w),add(w,q);
	dfs(1,0);pw2=pow_(2,mod-2);
	for(int i=1;i<=cnn;i++)
	{
		for(int j=0;j<qu[i].size();j++)
		{
			long long tt=qu[i][j];
			for(int k=h[tt];k;k=l[k].w)
			{
				if(bl[l[k].q]!=bl[tt])
				{
					if(!ve[bl[l[k].q]][bl[tt]]) stt[++cn1]=p{bl[l[k].q],bl[tt]},ve[bl[l[k].q]][bl[tt]]=ve[bl[tt]][bl[l[k].q]]=1;
				}
			}
		}
	}o=0;memset(h,0,sizeof(h));
	for(int i=1;i<=cn1;i++) add(stt[i].q,stt[i].w),add(stt[i].w,stt[i].q);
	dfs1(1,0);
	long long ann=(dp[1][2]-1)%mod;
	ann=ann*pow_(2,b)%mod;
	printf("%lld",(ann%mod+mod)%mod);
	return 0;
}