#include<bits/stdc++.h>
using namespace std;
const int N=5e5,M=1e6;
const long long mod=1e9+7;
int n,m,head[N+5],cnt,C,H[N+5];
int dfn[N+5],low[N+5],belong[N+5];
int t[N+5][2],s[N+5];
long long dp[N+5],p[M+N+5],ans;
bool vis[M+5],mark[M+5];
inline int Min(int x,int y){return x<y?x:y;}
inline long long Mod(long long x){return x>=mod?x-mod:x;}
inline long long MOD(long long x){return x>=mod?x%mod:x;}
struct Edge{
	int next,to;
}edge[2*M+5],e[2*M+5];
inline void addedge(int u,int v){
	edge[cnt].next=head[u];
	edge[cnt].to=v;
	head[u]=cnt++;
}
inline void addE(int u,int v){
	e[C].next=H[u];
	e[C].to=v;
	H[u]=C++;
}
void Tarjan(int x){
	int v;
	dfn[x]=low[x]=++cnt;
	for(int i=head[x];i!=-1;i=edge[i].next){
		v=edge[i].to;
		if(vis[i>>1])continue;
		vis[i>>1]=true;
		if(!dfn[v]){
			Tarjan(v);
			low[x]=Min(low[x],low[v]);
			if(low[v]>dfn[x])mark[i>>1]=true;
		}
		else low[x]=Min(low[x],dfn[v]);
	}
}
void dfs(int x){
	int v;
	belong[x]=cnt;
	t[cnt][0]++;
	for(int i=head[x];i!=-1;i=edge[i].next){
		v=edge[i].to;
		if(!belong[v]&&!mark[i>>1])dfs(v);
	}
}
void dfs2(int root,int dad){
	int son;
	long long now;
	dp[root]=1;
	for(int i=H[root];i!=-1;i=e[i].next){
		son=e[i].to;
		if(son==dad)continue;
		dfs2(son,root);
		now=Mod(dp[root]-p[s[root]]+mod);
		s[root]+=s[son]+1;
		ans=MOD(ans+MOD(dp[son]*now)*p[m-s[root]]);
		dp[root]=MOD(dp[root]*(dp[son]+p[s[son]+1]));
	}
	ans=MOD(ans+MOD(dp[root]*Mod(p[t[root][0]]-1))*p[m-s[root]]);
	s[root]+=t[root][1];
	dp[root]=MOD(dp[root]*p[t[root][0]+t[root][1]]);
	dp[root]=Mod(dp[root]-p[s[root]]+mod);
}
inline void read(int &num){
	num=0;
	register char ch;
	while(ch=getchar(),ch<48);
	do num=(num<<3)+(num<<1)+(ch^48);while(ch=getchar(),ch>=48);
}
int main(){
	freopen("barrack.in","r",stdin);
	freopen("barrack.out","w",stdout);
	memset(head,-1,sizeof(head));
	memset(H,-1,sizeof(H));
	int u,v;
	read(n);read(m);
	for(int i=1;i<=m;i++){
		read(u);read(v);
		addedge(u,v);
		addedge(v,u);
	}
	p[0]=1;
	for(int i=1;i<=n+m;i++)p[i]=Mod(p[i-1]*2);
	cnt=0;
	for(int i=1;i<=n;i++)if(!dfn[i])Tarjan(i);
	cnt=0;
	for(int i=1;i<=n;i++){
		if(!belong[i]){
			cnt++;
			dfs(i);
		}
	}
	for(int i=0;i<m;i++){
		u=belong[edge[i<<1].to];
		v=belong[edge[i<<1|1].to];
		if(mark[i]){
			addE(u,v);
			addE(v,u);
		}
		else t[u][1]++;
	}
	dfs2(1,0);
	printf("%lld",ans);
	fclose(stdin);
	fclose(stdout);
	return 0;
}
