#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=500005,mod=1000000007;
int n,m,x,y,ans,st[N],dfn[N],low[N],bl[N],f[N];
vector<int>e[N],E[N];
void dfs(int k,int fa){
	st[++st[0]]=k;
	dfn[k]=low[k]=++dfn[0];
	for(int i:e[k])
		if (i!=fa){
			if (!dfn[i])dfs(i,k);
			low[k]=min(low[k],low[i]);
		}
	if (dfn[k]==low[k]){
		m++;
		while (st[st[0]]!=k)bl[st[st[0]--]]=m;
		bl[st[st[0]--]]=m;
	}
}
void Dfs(int k,int fa){
	ans=(ans+f[k])%mod;
	for(int i:E[k])
		if (i!=fa){
			Dfs(i,k);
			f[i]=(ll)f[i]*(mod+1>>1)%mod;
			ans=(ans+(ll)f[k]*f[i])%mod;
			f[k]=(f[k]+f[i]+(ll)f[k]*f[i])%mod;
		}
}
int main(){
	freopen("barrack.in","r",stdin);
	freopen("barrack.out","w",stdout);
	scanf("%d%d",&n,&m);
	for(int i=1;i<=m;i++){
		scanf("%d%d",&x,&y);
		e[x].push_back(y);
		e[y].push_back(x);
	}
	m=0,dfs(1,0);
	for(int i=1;i<=m;i++)f[i]=1;
	for(int i=1;i<=n;i++)f[bl[i]]=(f[bl[i]]<<1)%mod;
	for(int i=1;i<=m;i++)f[i]--;
	for(int i=1;i<=n;i++)
		for(int j:e[i])
			if (bl[i]!=bl[j])E[bl[i]].push_back(bl[j]);
	Dfs(1,0);
	for(int i=1;i<=n;i++)
		for(int j:e[i])
			if (i<j)ans=(ans<<1)%mod;
	printf("%d\n",ans);
	return 0;
}
