#include<bits/stdc++.h>
using namespace std;
const int N=5e5+5,M=1e6+5,mod=1e9+7;
int pow2(int x,int y) {
	int mul=1;
	for(;y;y>>=1,x=x*1ll*x%mod) if(y&1) mul=mul*1ll*x%mod;
	return mul;
}
int n,m;
int head[N],tot;
struct edge{
	int to,nxt,vis;
}e[M<<1];
void add(int x,int y) {
	tot++;
	e[tot].to=y;e[tot].nxt=head[x];head[x]=tot;
	e[tot].vis=0;
	return;
}

int dfn[N],low[N],tim;
void tarjan(int x,int fa) {
	tim++;
	dfn[x]=low[x]=tim;
	for(int i=head[x];i;i=e[i].nxt) {
		int to=e[i].to;
		if(to==fa) continue;
		if(dfn[to]) {
			low[x]=min(low[x],dfn[to]);
		}
		else {
			tarjan(to,x);
			if(low[to]==dfn[to]) e[i].vis=e[i^1].vis=1;
			low[x]=min(low[x],low[to]);
		}
	}
	return;
}

int f[N],sz[N],szb[N];
int getf(int x) {
	if(f[x]==x) return x;
	return f[x]=getf(f[x]);
}
void merge(int x,int y) {
	x=getf(x),y=getf(y);
	if(x==y) {
		szb[x]++;
		return;
	}
	f[y]=x;//y -> x
	szb[x]+=szb[y];
	sz[x]+=sz[y];
	szb[x]++;
	return;
}

vector<int> e2[N];
int g[N][2];
int sonb[N];
void dfs(int x,int fa) {
	
	int koishi=e2[x].size();
	int pw=pow2(2,sz[getf(x)]);
	sonb[x]=0;
	if(fa&&koishi==1) {
		g[x][0]=0;
		g[x][1]=pw-1;
		return;
	}
	g[x][1]=pw;
	int cnt=0;
	for(int i=0;i<koishi;i++) {
		int to=e2[x][i];
		if(to==fa) continue;
		dfs(to,x);
		sonb[x]+=sonb[to]+1;
		
		g[x][1]=g[x][1]*1ll*(g[to][1]+pow2(2,sonb[to]+1))%mod;
		if(g[x][1]>=mod) g[x][1]-=mod;
	}
	
	int t=pow2(2,sonb[x]);
	g[x][1]-=t;
	if(g[x][1]<0) g[x][1]+=mod;
	
	for(int i=0;i<koishi;i++) {
		int to=e2[x][i];
		if(to==fa) continue;
		
		g[x][0]+=g[to][0]*2ll%mod*pow2(2,sonb[x]-(sonb[to]+1))%mod;
		if(g[x][0]>=mod) g[x][0]-=mod;
		
		g[x][0]+=g[to][1]*1ll*pow2(2,sonb[x]-(sonb[to]+1))%mod;
		if(g[x][0]>=mod) g[x][0]-=mod;
	}
	return;
}
int main() {
	freopen("barrack.in","r",stdin);
	freopen("barrack.out","w",stdout);
	scanf("%d%d",&n,&m);
	tot=1;
	for(int i=1;i<=m;i++) {
		int x,y;
		scanf("%d%d",&x,&y);
		add(x,y);
		add(y,x);
	}
	tarjan(1,0);
	
	for(int i=1;i<=n;i++) f[i]=i,sz[i]=1;
	for(int x=1;x<=n;x++) {
		for(int i=head[x];i;i=e[i].nxt) {
			int to=e[i].to;
			if(e[i].vis) continue;
			if(to<x) continue;
			merge(x,to);
		}
	}
	
	for(int x=1;x<=n;x++) {
		for(int i=head[x];i;i=e[i].nxt) {
			int to=e[i].to;
			if(!e[i].vis) continue;
			int a=getf(x),b=getf(to);
			e2[a].push_back(b);
		}
	}
	
	int rt=getf(1);
	dfs(rt,0);
	int ans=g[rt][0]+g[rt][1];
	if(ans>=mod) ans-=mod;
	for(int i=1;i<=n;i++) {
		if(f[i]==i) {
			ans=ans*1ll*pow2(2,szb[i])%mod;
		}
	}
	printf("%d\n",ans);
	return 0;
}
