#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=52;
#define CT cout << "\n---------------------\n";
struct Edge{
	int to,nxt,id;
}e[N*2];
int head[N],Top,iscut[N];
int low[N],dfn[N],dfn_cnt;
void dfs(int u,int frm){
	low[u]=dfn[u]=++dfn_cnt;
	for(int i=head[u];i;i=e[i].nxt){
		int to=e[i].to;
		if(e[i].id==frm) continue;
		if(!dfn[to]){
			dfs(to,e[i].id);
			low[u]=min(low[u],low[to]);
		}else low[u]=min(low[u],dfn[to]);
	}
	if(dfn[u]==low[u]) iscut[frm]=1;
}
const int LG=5;
int fa[N],ss[N][N];
int getf(int x){
	while(x!=fa[x]) x=fa[x]=fa[fa[x]];
	return x;
}
int dep[N];
void ddfs(int u,int f){
	dfn[u]=++dfn_cnt;
	ss[u][0]=f; dep[u]=dep[f]+1;
	for(int i=1;i<LG;++i) ss[u][i]=ss[ss[u][i-1]][i-1];
	for(int i=head[u];i;i=e[i].nxt){
		int to=e[i].to;
		if(to==f) continue;
		ddfs(to,u);
	}
}
int lca(int x,int y){
	if(dep[x]>dep[y]) swap(x,y);
	for(int i=LG-1;i>=0;--i)
		if(dep[ss[y][i]]>=dep[x]) y=ss[y][i];
	if(x==y) return x;
	for(int i=LG-1;i>=0;--i)
		if(ss[x][i]!=ss[y][i])
			x=ss[x][i],y=ss[y][i];
	return ss[x][0];
}
int n,m,U[N],V[N],pw[500005];
void add(int u,int v,int id){
	e[++Top].to=v;
	e[Top].nxt=head[u];
	head[u]=Top;
	e[Top].id=id;
}
const ll mod=1000000007;
int chs[N],cov[N],rec[500005],sum[500005];
const int inf=10000000;
int main(){
	freopen("barrack.in","r",stdin);
	freopen("barrack.out","w",stdout);
	ios::sync_with_stdio(0);
	cin.tie(0);
	cin >> n >> m;
	if(n>16){
		pw[0]=1;
		for(int i=1;i<=n;++i) pw[i]=2ll*pw[i-1]%mod;
		rec[1]=pw[n-1];
		for(int i=2;i<=n;++i){
			int edg=i-1;
			rec[i]=1ll*pw[i-2]*pw[m-edg]%mod;
		}
		for(int i=1;i<=n;++i) sum[i]=(sum[i-1]+rec[i])%mod;
		int ans=0;
		for(int i=1;i<=n;++i){
			int len=n-i+1;
			ans=(ans+sum[len])%mod;
		}
		cout << ans << '\n';
		return 0;
	}
	for(int i=1;i<=m;++i){
		int x,y; cin >> x >> y;
		U[i]=x; V[i]=y;
		add(x,y,i);
		add(y,x,i);
	}
	dfs(1,0);
	for(int i=1;i<=n;++i) fa[i]=i;
	for(int i=1;i<=m;++i){
		if(!iscut[i]){
			int x=getf(U[i]),y=getf(V[i]);
			fa[x]=y;
		}
	}
	Top=0;
	memset(head,0,sizeof(head));
	for(int i=1;i<=m;++i){
		if(iscut[i]){
//			cout << "qwq " << U[i] << ' ' << V[i] << '\n';
			int x=getf(U[i]),y=getf(V[i]);
//			cout << x << ' ' << y << '\n';
			add(x,y,i);
			add(y,x,i);
		}
	}
	dfn_cnt=0;
	ddfs(getf(1),0);
//	cout << "dfn=" << dfn_cnt << '\n';
	pw[0]=1;
	for(int i=1;i<=50;++i) pw[i]=2ll*pw[i-1]%mod;
	int tot=1<<n,ans=0;
//	CT
//	for(int i=1;i<=n;++i)
//		cout << getf(i) << ' ';
//	CT
	for(int s=1;s<tot;++s){
		memset(chs,0,sizeof(chs));
		int mn=inf,mx=0,mnid,mxid;
		for(int i=1;i<=n;++i){
			if((s>>(i-1))&1){
				int t=getf(i);
				if(dfn[t]<mn){
					mn=dfn[t];
					mnid=t;
				}
				if(dfn[t]>mx){
					mx=dfn[t];
					mxid=t;
				}
				chs[t]=1;
			}
		}
//		cout << "mn mx " << mnid << ' ' << mxid << '\n';
		int L=lca(mnid,mxid),tmp=0;
//		cout << "L " << L << '\n';
		memset(cov,0,sizeof(cov));
		for(int i=1;i<=n;++i){
			if(!chs[i]) continue;
			int u=i;
			while(u!=L){
				if(!cov[u]) cov[u]=1,++tmp;
				u=ss[u][0];
			}
		}
//		cout << "* " << s << ' ' << pw[m-tmp] << ' ' << tmp << '\n';
		ans=(ans+pw[m-tmp])%mod;
	}
	cout << ans << '\n';
	return 0;
}
/*
4 4
1 2
1 3
2 3
1 4
*/