#include<bits/stdc++.h>
#define fre(x) freopen(#x".in","r",stdin);freopen(#x".out","w",stdout)
#define ll long long
using namespace std;
inline int read(){
	int x=0,f=1;char c=getchar();
	while(c<'0'||c>'9') { if(c=='-') f=-1;c=getchar(); }
	while(c>='0'&&c<='9') x=(x<<3)+(x<<1)+(c^'0'),c=getchar();
	return x*f;
}
const int N=5e5+5,M=1e6+5,mod=1e9+7;
ll Pow(ll x,ll k){
	ll res=1;
	while(k){
		if(k&1) res=res*x%mod;
		x=x*x%mod,k>>=1;
	}
	return res;
}
struct edge{
	int y,next;
}e[M<<1];
int n,m;
int cnt=1,first[N];
void add(int x,int y){
	e[++cnt]={y,first[x]};
	first[x]=cnt;
}
int dfn[N],low[N],tim,vis[M<<1];
void tarjan(int x,int edg){
	dfn[x]=low[x]=++tim;
//	printf("%d ",x);
	for(int i=first[x];i;i=e[i].next) if(i!=(edg^1)){
		int y=e[i].y;
		if(!dfn[y]) tarjan(y,i),low[x]=min(low[x],low[y]);
		else{
			low[x]=min(low[x],dfn[y]);
		}
		if(dfn[x]<low[y]) vis[i]=vis[i^1]=1;
	}
}
int Col,c[N],siz[N],di[N];
void dfs(int x){
	c[x]=Col;
	siz[c[x]]++;
	for(int i=first[x];i;i=e[i].next){
		int y=e[i].y;
		if(vis[i]||c[y]) continue;
		dfs(y);
	}
}
ll v0[N],v1[N];
int dep[N],f[N];
vector<int>E[N];
void Dfs(int x,int fa){
	dep[x]=dep[fa]+1;
	f[x]=fa;
	for(auto y:E[x]){
		if(y==fa) continue;
		Dfs(y,x);
	}
}
int visit[N];
signed main(){
	fre(barrack);
	n=read(),m=read();
	for(int i=1;i<=m;i++){
		int x=read(),y=read();
		add(x,y);
		add(y,x);
	}
	tarjan(1,0);
	for(int x=1;x<=n;x++){
		if(c[x]) continue;
		Col++;
		dfs(x);
	}
	for(int x=1;x<=n;x++){
		for(int i=first[x];i;i=e[i].next){
			int y=e[i].y;
			if(c[x]==c[y]) di[c[x]]++;
		}
	}
	for(int i=1;i<=Col;i++) di[i]/=2,v1[i]=(Pow(2,siz[i])-1)*Pow(2,di[i])%mod,v0[i]=Pow(2,di[i]);
	for(int x=1;x<=n;x++){
		for(int i=first[x];i;i=e[i].next){
			int y=e[i].y;
			if(c[x]!=c[y]){
				E[c[x]].push_back(c[y]);
				E[c[y]].push_back(c[x]);
			}
		}
	}
	ll res=0;
	Dfs(1,0);
	for(int s=1;s<1<<Col;s++){
		ll sum=1;
		for(int i=1;i<=Col;i++){
			if(s>>(i-1)&1) sum=sum*v1[i]%mod;
			else sum=sum*v0[i]%mod;
		}
		for(int i=2;i<=Col;i++) visit[i]=0;
		for(int x=1;x<=Col;x++) if(s>>(x-1)&1)
			for(int y=1;y<=Col;y++) if((s>>(y-1)&1)&&y!=x){
				int px=x,py=y;
				if(dep[px]<dep[py]) swap(px,py);
				while(dep[px]>dep[py]) visit[px]=1,px=f[px];
				while(px!=py) visit[px]=visit[py]=1,px=f[px],py=f[py];
			}
		int tot=0;
		for(int i=2;i<=Col;i++) tot+=(!visit[i]);
		sum=sum*Pow(2,tot)%mod;
		res=(res+sum)%mod;
	}
	printf("%lld\n",res);
	return 0;
}
/*
2 2
1 2
1 2
*/
