#include <bits/stdc++.h>
using namespace std;

const int N=5e5+5;
const int M=1e6+5;
const int mod=1e9+7;

struct oi {
	int to;
	int id;
};

struct oio {
	int x,y;
};

vector<oi> b[N];
vector<int> c[N];
int n,m;
int t;
int dfn[N];
int low[N];
int vis[M];
int cnt;
int d[101];
int siz[101];
int siz_[101];
int st[101][11];
int vis2[N];
int dep[101];

int poww(int a,int b) {
	int ans=1;
	int sz=a;
	while(b) {
		if(b&1) ans=1ll*ans*sz%mod;
		sz=1ll*sz*sz%mod;
		b>>=1;
	}
	return ans;
}

void dfs(int u,int fa) {
	dfn[u]=low[u]=++t;
	for(int i=0; i<b[u].size(); i++) {
		int v=b[u][i].to;
		int id=b[u][i].id;
		if(v==fa) continue;
		if(dfn[v]<dfn[u]&&dfn[v]!=0) {
			low[u]=min(low[u],dfn[v]);
		} else {
			if(dfn[v]==0) dfs(v,u);
			low[u]=min(low[u],low[v]);
			if(low[v]>dfn[u])
				vis[id]=1;
		}
	}
}

void dfs2(int u,int fa) {
	if(vis2[u]!=0) return ;
	vis2[u]=cnt;
	for(int i=0; i<b[u].size(); i++) {
		int v=b[u][i].to;
		int id=b[u][i].id;
		if(v==fa) continue;
		if(vis[id]==1) continue;
		dfs2(v,u);
	}
}

oio LCA(int u,int v) {
	int t=dep[u]-dep[v]-1;
	int tot=0;
	if(t>=0) {
		while(t) {
			if(t&1) u=st[u][tot];
			++tot,t>>=1;
		}
		if(st[u][0]==v) 
			return (oio){st[u][0],0};
	}
	for(int j=10; j>=0; j--)
		if(st[u][j]!=st[v][j]) 
			u=st[u][j],v=st[v][j];
	return (oio){u,v};
}

void dfs5(int u,int fa) {
	if(d[u]==1) siz[u]=1;
	siz_[u]=1;
	
	for(int i=0; i<c[u].size(); i++) {
		int v=c[u][i];
		if(v==fa) continue;
		if(siz_[v]!=0) continue;
		dfs5(v,u);
		siz[u]+=siz[v];
		siz_[u]+=siz_[v];
	}
}
int tot;
int ans=0;

void dfs6(int u,int fa) {
	for(int i=0; i<c[u].size(); i++) {
		int v=c[u][i];
		if(v==fa) continue;
		if(i>0&&v==c[u][i-1]) continue;
		if(siz[v]!=0) dfs6(v,u);
		else 
			tot+=(siz_[v]);
	}
}

void work() {
	memset(siz,0,sizeof(siz));
	memset(siz_,0,sizeof(siz_));
	dfs5(1,0);
	tot=0;
	dfs6(1,0);
	tot=(cnt-1-tot);
	tot=(m-tot);
	ans=(ans+poww(2,tot))%mod;
}

void dfs4(int u,int fa) {
	dep[u]=dep[fa]+1;
	st[u][0]=fa;
	for(int i=0; i<c[u].size(); i++) {
		int v=c[u][i];
		if(v==fa) continue;
		 if(i>0&&v==c[u][i-1]) continue;
		dfs4(v,u);
	}
}

void dfs3(int dep) {
	if(dep>n) {
		work();
		return ;
	}
	d[vis2[dep]]=1;
	dfs3(dep+1);
	d[vis2[dep]]=0;
	dfs3(dep+1);
}

int main() {
	freopen("barrack.in","r",stdin);
	freopen("barrack.out","w",stdout);
	cin>>n>>m;
	for(int i=1; i<=m; i++) {
		int u,v;
		scanf("%d%d",&u,&v);
		b[u].push_back({v,i});
		b[v].push_back({u,i});
	}
	dfs(1,0);
//	for(int i=1; i<=m; i++)
//		printf("%d ",vis[i]);
	if(n<=16) {
		for(int i=1; i<=n; i++)
			if(vis2[i]==0)
				++cnt,dfs2(i,0);
		for(int i=1; i<=n; i++)
			for(int j=0; j<b[i].size(); j++) {
				int u=i;
				int v=b[i][j].to;
				int id=b[i][j].id;
			//	if(vis[id]==1) continue;
				if(vis2[u]==vis2[v]) continue;
				u=vis2[u];
				v=vis2[v];
				c[u].push_back(v);
				c[v].push_back(u);
			}
		for(int i=1; i<=cnt; i++) {
			sort(c[i].begin(),c[i].end());
			//unique(c[i].begin(),c[i].end());
		}
		dfs4(1,0);
		for(int j=1; j<=10; j++)
			for(int i=1; i<=n; i++)
				st[i][j]=st[st[i][j-1]][j-1];
		dfs3(1);
		ans=(ans-poww(2,m-1)+mod)%mod;
	} else {
		ans=1ll*n*poww(2,m)%mod;
		for(int len=2; len<=n; len++) 
			ans=(ans+1ll*(n-len+1)*poww(2,len-2)%mod*poww(2,(n-1)-(len-1))%mod)%mod;
		
	}

	printf("%d",ans);
	return 0;
}