#include<bits/stdc++.h>
#define mod 1000000007
using namespace std;
const int N=5e5+5;
int low[N],dfn[N],tim;
vector<int> g[N];
map<pair<int,int>,int> cut;
void tarjan(int x,int fa) {
	low[x]=dfn[x]=++tim;
	for(int i=0; i<g[x].size(); i++) {
		int y=g[x][i];
		if(!dfn[y]) {
			tarjan(y,x);
			if(low[y]>dfn[x]) cut[minmax(x,y)]=1;
			low[x]=min(low[x],low[y]);
		} else if(y!=fa) low[x]=min(low[x],dfn[y]);
	}
}
int id[N],vis[N],a[N],b[N],cnt;
void dfs(int x,int fa) {
	id[x]=cnt,a[cnt]++,vis[x]=1;
	for(int i=0; i<g[x].size(); i++) {
		int y=g[x][i];
		if(cut[minmax(x,y)]) continue;
		b[cnt]++;
		if(y==fa||vis[y]) continue;
		dfs(y,x);
	}
}
const int M=1e6+5;
long long f[N][5],pw2[M];
vector<int> t[N];
long long pre[M],suf[M];
void solve(int x,int fa) {
	f[x][0]=pw2[b[x]];
	for(int i=0; i<t[x].size(); i++) {
		if(t[x][i]==fa) continue;
		solve(t[x][i],x);
		(f[x][0]*=2*f[t[x][i]][0]%mod)%=mod;
	}
	pre[0]=suf[t[x].size()]=1;
	for(int i=0; i<t[x].size(); i++) {
		pre[i+1]=pre[i];
		if(t[x][i]==fa) continue;
		pre[i+1]=2*f[t[x][i]][0]%mod*pre[i]%mod;
	}
	for(int i=t[x].size()-1; i>=0; i--) {
		suf[i]=suf[i+1];
		if(t[x][i]==fa) continue;
		suf[i]=2*f[t[x][i]][0]%mod*suf[i+1]%mod;
	}
	for(int i=0; i<t[x].size(); i++) {
		if(t[x][i]==fa) continue;
		(f[x][1]+=pre[i]*suf[i+1]%mod*(2*f[t[x][i]][1]%mod)%mod*pw2[b[x]]%mod)%=mod;
	}
	long long g0=1,g1=0,g2=0;
	for(int i=0; i<t[x].size(); i++) {
		if(t[x][i]==fa) continue;
		g2=((f[t[x][i]][2]+2*f[t[x][i]][0]%mod)%mod*g2%mod+f[t[x][i]][2]*g1%mod)%mod;
		g1=(2*f[t[x][i]][0]%mod*g1%mod+f[t[x][i]][2]*g0%mod)%mod;
		g0=2*f[t[x][i]][0]%mod*g0%mod;
	}
	f[x][1]=(f[x][1]+g2*pw2[b[x]]%mod)%mod;
	long long qwq=(pw2[a[x]]-1)*pw2[b[x]]%mod;
	for(int i=0; i<t[x].size(); i++) {
		if(t[x][i]==fa) continue;
		qwq=qwq*((2*f[t[x][i]][0]%mod+f[t[x][i]][2])%mod)%mod;
	}
	f[x][1]=(f[x][1]+qwq)%mod;
	
	pre[0]=suf[t[x].size()]=1;
	for(int i=0; i<t[x].size(); i++) {
		pre[i+1]=pre[i];
		if(t[x][i]==fa) continue;
		pre[i+1]=2*f[t[x][i]][0]%mod*pre[i]%mod;
	}
	for(int i=t[x].size()-1; i>=0; i--) {
		suf[i]=suf[i+1];
		if(t[x][i]==fa) continue;
		suf[i]=2*f[t[x][i]][0]%mod*suf[i+1]%mod;
	}
	for(int i=0; i<t[x].size(); i++) {
		if(t[x][i]==fa) continue;
		(f[x][2]+=pre[i]*suf[i+1]%mod*f[t[x][i]][2]%mod*pw2[b[x]]%mod)%=mod;
	}
	g0=1,g1=0,g2=0;
	for(int i=0; i<t[x].size(); i++) {
		if(t[x][i]==fa) continue;
		g2=(f[t[x][i]][2]+2*f[t[x][i]][0]%mod)%mod*g2%mod+f[t[x][i]][2]*g1%mod;
		g1=2*f[t[x][i]][0]%mod*g1%mod+f[t[x][i]][2]*g0%mod;
		g0=2*f[t[x][i]][0]%mod*g0%mod;
	}
	f[x][2]=(f[x][2]+g2*pw2[b[x]]%mod)%mod;
	qwq=(pw2[a[x]]-1)*pw2[b[x]]%mod;
	for(int i=0; i<t[x].size(); i++) {
		if(t[x][i]==fa) continue;
		qwq=qwq*((2*f[t[x][i]][0]%mod+f[t[x][i]][2])%mod)%mod;
	}
	f[x][2]=(f[x][2]+qwq)%mod;
}
inline int read() {
	int x=0;
	char ch=getchar();
	while(ch<'0'||ch>'9') ch=getchar();
	while(ch>='0'&&ch<='9') x=(x<<1)+(x<<3)+(ch-'0'),ch=getchar();
	return x;
}
signed main() {
	freopen("barrack.in","r",stdin);
	freopen("barrack.out","w",stdout);
	int n,m;
	n=read(),m=read();
	if(n==1) {
		cout<<2<<'\n';
		return 0;
	}
	for(int i=1,u,v; i<=m; i++) {
		u=read(),v=read();
		g[u].push_back(v);
		g[v].push_back(u);
	}
	tarjan(1,0);
	for(int i=1; i<=n; i++)
		if(!vis[i]) cnt++,dfs(i,0),b[cnt]/=2;
	for(int i=1; i<=n; i++)
		for(auto y:g[i]) {
			if(i>y) continue;
			if(!cut[minmax(i,y)]) continue;
			t[id[i]].push_back(id[y]);
			t[id[y]].push_back(id[i]);
		}
	for(int i=pw2[0]=1; i<=m; i++) pw2[i]=pw2[i-1]*2%mod;
	solve(1,0);
	cout<<f[1][1];
}
