#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=500005;
const int M=1000005;
const int MOD=1000000007;
int n,m,a,b;
int nxt[M<<1],head[N],to[M<<1],tot=1;bool cut[M<<1];
int low[N],dfn[N],cnt;
int be[N],num1[N],num2[N],kind;
int nxt0[M<<1],head0[N],to0[M<<1],tot0;
int f[N][2];
int qpow[M<<1];
int read(){
	int num=0,k=1;char c='&';
	while(c<'0' or c>'9'){
		c=getchar();
		if(c=='-') k=-1;
	}
	while(c>='0' and c<='9'){
		num=(num<<3)+(num<<1)+c-'0';
		c=getchar();
	}
	return num*k;
}
void pre_qpow(){
	qpow[0]=1;
	for(int i=1;i<=m*2;i++) qpow[i]=qpow[i-1]*2%MOD;
}
void add(int x,int y){
	nxt[++tot]=head[x];
	head[x]=tot;
	to[tot]=y;
}
void add0(int x,int y){
	nxt0[++tot0]=head0[x];
	head0[x]=tot0;
	to0[tot0]=y;
}
void tarjan(int x,int fa){
	dfn[x]=low[x]=++cnt;
	for(int i=head[x];i;i=nxt[i]){
		int s=to[i];
		if(!dfn[s]){
			tarjan(s,x);
			low[x]=min(low[x],low[s]);
			if(dfn[x]<low[s])
				cut[i]=cut[i^1]=true;
		}
		else if(s!=fa) low[x]=min(dfn[s],low[x]);
	}
}
void dfs0(int x,int k){
	be[x]=k;num1[k]++;
	for(int i=head[x];i;i=nxt[i]){
		int s=to[i];
		if(cut[i]){
			if(be[s] and be[s]!=k){
				add0(k,be[s]);
				add0(be[s],k);
			}
			continue;
		}
		else if(be[s]==k) continue;
		else dfs0(s,k);
	}
}
void pre(){
	for(int i=1;i<=n;i++)
		for(int j=head[i];j;j=nxt[j])
			if(!cut[j]) num2[be[i]]++;
	for(int i=1;i<=kind;i++) num2[i]>>=1;
}
void dfs1(int x,int fa){
	int val0=qpow[num2[x]],val2=qpow[num2[x]];
	int val1=(qpow[num2[x]+num1[x]]-qpow[num2[x]]+MOD)%MOD;
	int flag=0;
	for(int i=head0[x];i;i=nxt0[i]){
		int s=to0[i];
		if(s==fa) continue;
		flag=1;
		dfs1(s,x);
		val0=val0*f[s][0]*2%MOD;
		val1=val1*(f[s][0]*2+f[s][1])%MOD;
		val2=val2*f[s][1]*2%MOD;
	}
	f[x][0]=val0;
	f[x][1]=(val1+val2*flag)%MOD;
}
signed main(){
	freopen("barrack.in","r",stdin);
	freopen("barrack.out","w",stdout);
	n=read();m=read();pre_qpow();
	for(int i=1;i<=m;i++){
		a=read();b=read();
		add(a,b);add(b,a);
	}
	tarjan(1,0);
	for(int i=1;i<=n;i++)
		if(!be[i]) dfs0(i,++kind);
	pre();
	dfs1(1,0);
	cout<<f[1][1]<<endl;
	return 0;
}