#include<iostream>
#include<cstdio>
#define ll long long
#define Mod ((ll)1000000007)
using namespace std;
int n,m,x,y;
int edgenum,NIL=-1,head[500005],vet[1000005],nex[1000005];
int edge[500005],dp[500005][5];
void addedge(int u,int v){
	edgenum++;
	nex[edgenum]=head[u];
	vet[edgenum]=v;
	head[u]=edgenum;
}
ll kuaisu(ll x,int num){
	if(num==0) return 1;
	if(num==1) return x;
	ll sum=kuaisu(x,num/2);
	if(num&1) return sum*sum%Mod*x%Mod;
	return sum*sum%Mod;
}
void DFS(int u,int fu){
	for(int i=head[u];i!=NIL;i=nex[i]){
		int v=vet[i];
		if(v==fu) continue;
		DFS(v,u);
		edge[u]+=edge[v]+1;
	}
}
void DP(int u,int fu){
	int num=0;
	dp[u][1]=dp[u][0]=1;
	for(int i=head[u];i!=NIL;i=nex[i]){
		int v=vet[i];
		if(v==fu) continue;
		num++;
		DP(v,u);
	//	printf("@%d %d\n",dp[u][1],kuaisu(2,edge[u]-edge[v]));
		dp[u][0]=(dp[u][0]-1+Mod+(dp[v][0]+dp[v][1])*kuaisu(2,edge[u]-edge[v])%Mod+dp[v][1]*2%Mod*(dp[u][1]-1+Mod)%Mod)%Mod;
		dp[u][1]=(dp[u][1]-1+Mod+(dp[v][1]*2%Mod*kuaisu(2,edge[u]-edge[v]-1)%Mod)+dp[v][1]*2%Mod*(dp[u][1]-1+Mod)%Mod)%Mod;
	}
	//printf("!%d %d %d %d\n",u,edge[u],dp[u][0],dp[u][1]);
}
int main(){
	freopen("barrack.in","r",stdin);
	freopen("barrack.out","w",stdout);
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++){
		head[i]=NIL;
	}
	for(int i=1;i<=m;i++){
		scanf("%d%d",&x,&y);
		addedge(x,y);
		addedge(y,x);
	}
	DFS(1,0);
	DP(1,0);
	printf("%lld\n",(dp[1][0]+dp[1][1]-1+Mod)%Mod);
	return 0;
}