#include<bits/stdc++.h>
#define mod 1000000007
#define M 1000010
#define N 500010
#define ll long long
//#define int long long
using namespace std;

int n,m,cnt,cn1,idx,top,cc,ans;
int g[M],he[N],h1[N],dfn[N],low[N],f[N],h[N],sta[N],dp[N][3],sz[N];
vector<int> vec[N];
struct node {
	int to, ne;
}e[M*2],e1[M*2];
void add(int x, int y) {
	e[++cnt]={y,he[x]};
	he[x]=cnt;
}
void ad(int x, int y) {
	e1[++cn1]={y,h1[x]};
	h1[x]=cn1;
}
void dfs(int x,int fa) {
	dfn[x]=low[x]=++idx,sta[++top]=x;
	for(int i = he[x]; i; i=e[i].ne) {
		int y=e[i].to;
		if(i==(fa^1)) continue;
		if(!dfn[y]) dfs(y,i),low[x]=min(low[x],low[y]);
		else low[x]=min(low[x],dfn[y]);
	}
	if(low[x]==dfn[x]) {
		++cc;
		vec[cc].push_back(x),f[x]=cc;
		while(sta[top]!=x) vec[cc].push_back(sta[top]),f[sta[top]]=cc,top--;
		top--;
	}
}
void hh(int &a, int b) {
	a=((ll)a+b)%mod;
}
void sol(int x, int fa) {
	int tmp=1;
	dp[x][0]=dp[x][2]=g[h[x]],sz[x]=h[x];
	dp[x][1]=(ll)g[h[x]]*(g[vec[x].size()]-1)%mod;
	for(int i = h1[x]; i; i=e1[i].ne) {
		int y=e1[i].to;
		if(y==fa) continue;
		sol(y,x),sz[x]+=sz[y]+1;
		hh(ans,(ll)dp[y][2]*(tmp+mod-1)%mod*g[h[x]]%mod);
//		hh(tmp,dp[y][2]);
		tmp=(ll)tmp*(dp[y][2]+1)%mod;
		dp[x][0]=(ll)dp[x][0]*dp[y][0]*2%mod;
		dp[x][1]=(ll)dp[x][1]*(((ll)dp[y][0]*2%mod+dp[y][1]+dp[y][2])%mod)%mod;
		dp[x][2]=(ll)dp[x][2]*(((ll)dp[y][0]*2%mod+dp[y][1]+dp[y][2])%mod)%mod;
	}
//	hh(dp[x][2],mod-dp[x][0]);
	dp[x][2]=((ll)dp[x][2]+mod-dp[x][0])%mod;
	hh(ans,(ll)dp[x][1]*g[m-sz[x]]%mod);
}
int main()
{
	freopen("barrack.in","r",stdin);
	freopen("barrack.out","w",stdout);
	scanf("%d%d",&n,&m);
	g[0]=1,cnt=1;
	for(int i = 1; i<=m||i<=n; i++) g[i]=(ll)g[i-1]*2%mod;
	for(int i = 1; i <= m; i++) {
		int u, v;
		scanf("%d%d",&u,&v);
		add(u,v),add(v,u);
	}
	dfs(1,-1);
	for(int x = 1; x <= n; x++)
		for(int i = he[x]; i; i=e[i].ne) {
			int y=e[i].to;
			if(f[y]==f[x]) h[f[x]]++;
			else if(f[x]<f[y]) ad(f[x],f[y]),ad(f[y],f[x]);
		}
	for(int i = 1; i <= cc; i++) h[i]/=2;
	sol(1,0);
	printf("%d\n",ans);
	return 0;
}