#include<bits/stdc++.h>
#define Mod 1000000007
#define int long long
using namespace std;
int n,m;bool ks[500039];
struct edge{int u,v;}P;
vector<int>f[500039];int w;
vector<edge>E;int r,Edges;
int pow_2[1000039]={1,2,4};
int ans;
int pows(int u,int k){
	int ret=1;
	while(k){
		if(k&1)ret=(ret*u)%Mod;
		u=(u*u)%Mod;k>>=1;
	}
	return ret%Mod;
}
void dfs(int u,int o){
	if(ks[u])return;ks[u]=1;
	for(int i=0;i<f[u].size();i++){
		if(!((u==E[o].u&&f[u][i]==E[o].v)||(u==E[o].v&&f[u][i]==E[o].u))){
			if(!ks[f[u][i]])dfs(f[u][i],o);
			Edges++;
		}
	}
	return;
}
signed main(){
    freopen("barrack.in","r",stdin);
    freopen("barrack.out","w",stdout);
    scanf("%lld%lld",&n,&m);
    for(int i=3;i<=1000000;i++)pow_2[i]=(pow_2[i-1]*2)%Mod;
    for(int i=1;i<=m;i++){
    	scanf("%lld%lld",&P.u,&P.v);
    	f[P.u].push_back(P.v);
    	f[P.v].push_back(P.u);
    	E.push_back(P);
	}
	if(m==n-1){
		for(int i=0;i<m;i++){
			if(abs(E[i].u-E[i].v)!=1){
				goto PT;
			}
		}
		for(int i=0;i<m;i++){
			ans+=(pow_2[i+1]-1)*(pow_2[n-i-1]-1)%Mod;
		}
		ans=ans*n-ans/(m-1>0?m-1:1);
		printf("%lld",(pow_2[n]-1)*(pow_2[m])%Mod-(ans)%Mod);
		return 0;
	}
	else{
		PT:for(int i=0;i<m;i++){
	    	for(int j=1;j<=n;j++)ks[j]=0;Edges=0;r=0;
	    	dfs(1,i);
	    	for(int j=1;j<=n;j++)if(ks[j])r++;
	    	if(r^n){
	    		w++;Edges/=2;
	    		ans+=(pow_2[r]-1)*(pow_2[n-r]-1)%Mod;
				ans%=Mod;
			}
		}
		ans*=((pow_2[w-1])*(pow_2[m-w]))%Mod;
		printf("%lld",(pow_2[n]-1)*(pow_2[m])%Mod-(ans)%Mod);
	}
    return 0;
}
