#include<bits/stdc++.h>
using namespace std;
#define int long long 
#define mod 1000000007
#define maxn 100005
int he[maxn],nex[maxn],to[maxn];
int tot=1;
int qp(int x,int t){
	int ret=1,base=x%mod;
	while(t){
		if(t&1){
			ret=ret*base%mod;
		}
		base=base*base%mod;//cout<<t<<endl;
		t>>=1;
	}
    return ret;
}
void add(int u,int v){
	to[++tot]=v;
	nex[tot]=he[u];
	he[u]=tot;
	to[++tot]=u;
	nex[tot]=he[v];
	he[v]=tot;
}
int dfn[maxn],l[maxn];
int cnt;
int vis[maxn];
void tarjan(int u,int fr){
	dfn[u]=++cnt;l[u]=cnt;
	for(int i=he[u];i;i=nex[i]){
		if(i==(fr^1))continue;
		if(!dfn[to[i]]){
			tarjan(to[i],i);
			l[u]=min(l[u],l[to[i]]);
		}
		else {
			l[u]=min(l[u],dfn[to[i]]);
		}	
		if(dfn[u]<l[to[i]]){
			vis[i]=1;
			vis[i^1]=1;
		}
	}
}
int n,m;
int ecnt[maxn];
int dcnt[maxn];
int num;
int col[maxn];
int ecol[maxn];
void dfs(int u,int fr){
	col[u]=num;
	dcnt[num]++;
	for(int i=he[u];i;i=nex[i]){
		if(i==(fr^1))continue;
		if(vis[i])continue;
		ecol[i]=num;
		if(col[to[i]])continue;
		dfs(to[i],i);
	}
}
vector<int>a[maxn];
int dp[maxn];
void dfs2(int u,int fa){
	//cout<<u<<endl;
	dp[u]=qp(2,ecnt[u])*(qp(2,dcnt[u])-1)%mod;//only u
//	cout<<u<<' '<<dp[u]<<' '<<ecnt[u]<<endl;
	int pre=1;
	bool f=0;
	int tt=ecnt[u];
//	cout<<u<<endl;
	for(int i=0;i<a[u].size();i++){
		int v=a[u][i];
		if(v==fa)continue;
		dfs2(v,u);
		f=1;
		pre*=(dp[v]+qp(2,ecnt[v]+1));pre%=mod;
	}
	if(f)dp[u]=(pre-1)*(dp[u]+qp(2,ecnt[u]))+dp[u];
}
int c[maxn];
int calc(int x,int y){
	return c[x]*qp(c[y],mod-2)%mod*qp(c[x-y],mod-2)%mod;
}
signed main(){
	freopen("barrack.in","r",stdin);
	freopen("barrack.out","w",stdout);
	scanf("%lld%lld",&n,&m);
	for(int i=1;i<=m;i++){
		int u,v;
		scanf("%lld%lld",&u,&v);
		add(u,v);
	}
	c[0]=1;
	for(int i=1;i<=n;i++){
		c[i]=c[i-1]*i%mod;
	}
	if(m==n-1){
		int ans=0;
		for(int i=1;i<=n;i++){
			ans+=qp(2,n-i)%mod*calc(n,i);
		}
		printf("%lld\n",ans);
		return 0;
	}
	tarjan(1,0);
	/*
	for(int i=1;i<=n;i++)printf("%d ",dfn[i]);
	printf("\n");
	for(int i=1;i<=n;i++)printf("%d ",l[i]);
	printf("\n");
	for(int i=1;i<=m*2+1;i++){
		if(vis[i]){
			printf("%d %d ",to[i],to[i^1]);
		}
	}*/
	for(int i=1;i<=n;i++){
		if(!col[i]){
			++num;
			dfs(i,0);
		}
	}
	for(int i=2;i<=tot;i+=2){
		if(ecol[i]||ecol[i^1]){
			ecnt[ecol[i]==0?ecol[i^1]:ecol[i]]++;
		}
	}
	for(int i=2;i<=tot;i++){
		if(vis[i]){
			a[col[to[i^1]]].push_back(col[to[i]]);
	//		cout<<col[to[i]]<<'s'<<col[to[i^1]]<<endl;
		//	cout<<"asdjsakdj"<<endl;
		}
	}
//	cout<<a[1].size()<<'s'<<a[2].size()<<endl;
	//cout<<"asdasd"<<endl;
	dfs2(1,0);
	printf("%lld\n",dp[1]);
}