#include<bits/stdc++.h>
using namespace std;
const int mod=1e9+7;
int n,m,x,y,s[500100],nxt[2000100],u[2000100],v[2000100],cnt=1,dfn[500100],low[500100],blo[500100],cntt[500100],siz[500100],p[1000100],dp[500100][3],d[500100];
vector <int> tto[500100];
bool bri[2000100];
void add(int x,int y){
	nxt[++cnt]=s[x];
	s[x]=cnt;
	v[cnt]=y;
	u[cnt]=x;
	return;
}
int power(int x,int p){
	int sum=1;
	for(int i=p;i;i>>=1){
		if(i&1){
			sum=1ll*sum*x%mod;
		}
		x=1ll*x*x%mod;
	}
	return sum;
}
void tarjan(int now,int fa){
	dfn[now]=low[now]=++cnt;
	for(int i=s[now];i;i=nxt[i]){
		if(v[i]==fa){
			continue;
		}
		if(!dfn[v[i]]){
			tarjan(v[i],now);
			low[now]=min(low[now],low[v[i]]);
			if(dfn[now]<low[v[i]]){
				bri[i]=bri[i^1]=1;
			}
		}
		else{
			low[now]=min(low[now],dfn[v[i]]);
		}
	}
	return;
}
void dfs(int now){
	blo[now]=cnt;
	d[cnt]++;
	for(int i=s[now];i;i=nxt[i]){
		if(bri[i]){
			continue;
		}
		cntt[cnt]++;
		if(!blo[v[i]]){
			dfs(v[i]);
		}
	}
	return;
}
void DP(int now,int fa){
	int ncnt=cntt[now],sum=1,summ=1,sum2=1;
	siz[now]=1;
	for(int i=0;i<tto[now].size();i++){
		int vt=tto[now][i],hr=0,hrr=0,hr2=0;
		if(vt!=fa){
			DP(vt,now);
			hr=(hr+p[cntt[vt]+siz[vt]])%mod;
			hr=(hr+dp[vt][0]%mod)%mod;
			hr=(hr+dp[vt][1]%mod)%mod;
			hrr=(hrr+p[cntt[vt]+siz[vt]])%mod;
			hrr=(hrr+dp[vt][2]%mod)%mod;
			hrr=(hrr+dp[vt][1]%mod)%mod;
			hr2=(hr2+p[cntt[vt]+siz[vt]])%mod;
			hr2=(hr2+dp[vt][2]%mod)%mod;
			hr2=(hr2+dp[vt][1]%mod)%mod;
			sum=1ll*sum*hr%mod;
			summ=1ll*summ*hrr%mod;
			sum2=1ll*sum2*hr2%mod;
			cntt[now]+=cntt[vt];
			siz[now]+=siz[vt];
		}
	}
	if(tto[now].size()==1&&fa){
		dp[now][0]=0;
		dp[now][1]=1ll*(p[d[now]]-1)*p[ncnt]%mod;
		dp[now][2]=0;
	}
	else{
		dp[now][0]=1ll*sum*p[ncnt]%mod;
		dp[now][1]=1ll*summ*p[ncnt]%mod*(p[d[now]]-1)%mod;
		dp[now][2]=1ll*sum2*p[ncnt]%mod;
		sum=1;
		for(int i=0;i<tto[now].size();i++){
			int vt=tto[now][i];
			if(vt!=fa){
				sum=1ll*sum*p[cntt[vt]+siz[vt]]%mod;
			}
		}
		for(int i=0;i<tto[now].size();i++){
			int vt=tto[now][i],hr=sum;
			if(vt!=fa){
				hr=1ll*hr*power(p[cntt[vt]+siz[vt]],mod-2)%mod;
				hr=1ll*(dp[vt][0]+dp[vt][1])%mod*hr%mod;
				dp[now][0]=(dp[now][0]+1ll*hr*p[ncnt]%mod)%mod;
			}
		}
		dp[now][0]=(dp[now][0]+mod-p[cntt[now]+siz[now]-1])%mod;
		dp[now][2]=(dp[now][2]+mod-p[cntt[now]+siz[now]-1])%mod;
	}
//	cout<<now<<" "<<dp[now][0]<<" "<<dp[now][1]<<" "<<dp[now][2]<<endl;
	return;
}
signed main(){
	freopen("barrack.in","r",stdin);
	freopen("barrack.out","w",stdout);
	scanf("%d%d",&n,&m);
	p[0]=1;
	for(int i=1;i<=m+10;i++){
		p[i]=1ll*p[i-1]*2%mod;
	}
	for(int i=1;i<=m;i++){
		scanf("%d%d",&x,&y);
		add(x,y);
		add(y,x);
	}
	cnt=0;
	tarjan(1,0);
	cnt=0;
	for(int i=1;i<=n;i++){
		if(!blo[i]){
			cnt++;
			dfs(i);
		}
	}
	for(int i=1;i<=cnt;i++){
		cntt[i]/=2;
	}
	for(int i=2;i<=2*m+1;i++){
		if(bri[i]){
			tto[blo[u[i]]].push_back(blo[v[i]]);
		}
	}
	DP(1,0);
	printf("%d\n",(dp[1][0]+dp[1][1])%mod);
	return 0;
}
/*
9 11
1 2
2 3
1 3
2 4
4 5
5 6
4 6
6 7
7 8
7 9
8 9

11 13
1 2
1 3
2 3
2 4
4 5
4 6
5 6
6 7
7 8
8 9
8 10
9 10
10 11

11 13
1 2
2 3
3 4
2 4
4 5
5 6
5 7
6 7
7 8
8 9
9 10
9 11
10 11

6 6
1 2
2 3
2 4
3 4
3 5
1 6
*/
