#include<bits/stdc++.h>
#define N 500005
#define M 1000005
using namespace std;
typedef long long ll;
const ll mod=1e9+7;
int n,m;
int tot,ver[M<<1],nxt[M<<1],head[N];
void add_E(int x,int y){ver[++tot]=y,nxt[tot]=head[x],head[x]=tot;}
int dfn[N],low[N],dfn_tot;
bool d[M<<1];
void tarjan(int x,int in_edge)
{
	dfn[x]=low[x]=++dfn_tot;
	for(int i=head[x];i;i=nxt[i])
	{
		int y=ver[i];
		if(!dfn[y])
		{
			tarjan(y,i);
			if(low[y]>dfn[x]) d[i]=d[i^1]=1;
			low[x]=min(low[x],low[y]);
		}
		else if((i^1)!=in_edge) low[x]=min(low[x],dfn[y]);
	}
}
int cntn[N],cntm[N],dcc,belong[N];
bool vis[N];
void dfs(int x)
{
	vis[x]=1,cntn[dcc]++;
	belong[x]=dcc;
	for(int i=head[x];i;i=nxt[i])
	{
		int y=ver[i];
		if(d[i]||vis[y]) continue;
		dfs(y);
	}
}
int L[M],R[M];
ll two[M];
int dep[N],f[N][10];
void dfs2(int x)
{
	for(int i=1;i<=5;i++) f[x][i]=f[f[x][i-1]][i-1];
	for(int i=head[x];i;i=nxt[i])
	{
		int y=ver[i];
		if(y==f[x][0]) continue;
		f[y][0]=x,dep[y]=dep[x]+1;
		dfs2(y);
	}
}
int lca(int x,int y)
{
	if(dep[x]<dep[y]) swap(x,y);
	for(int i=5;i>=0;i--) if(dep[f[x][i]]>=dep[y]) x=f[x][i];
	if(x==y) return x;
	for(int i=5;i>=0;i--) if(f[x][i]!=f[y][i]) x=f[x][i],y=f[y][i];
	return f[x][0];
}
int sum[N],num;
void dfs3(int x)
{
	for(int i=head[x];i;i=nxt[i])
	{
		int y=ver[i];
		if(y==f[x][0]) continue;
		dfs3(y);
		sum[x]+=sum[y];
	}
	if(sum[x]>0) num++;
}
int v[N];
namespace pb
{
	bool mark[N];
	void solve()
	{
		ll ans=0;
		for(int i=1;i<(1<<n);i++)
		{
			for(int j=1;j<=dcc;j++) mark[j]=0,sum[j]=0;
			for(int j=0;j<n;j++) if(i&(1<<j)) mark[belong[j+1]]=1;
			for(int j=1;j<=dcc;j++)
			{
				for(int k=j+1;k<=dcc;k++)
				{
					if(mark[j]&&mark[k])
					{
						int L=lca(j,k);
						sum[j]++,sum[k]++,sum[L]-=2;
					}
				}
			}
			num=0,dfs3(1);
			ans=(ans+two[m-num])%mod;
		}
		printf("%lld\n",ans);
	}
}
int main()
{
	freopen("barrack.in","r",stdin);
	freopen("barrack.out","w",stdout);
	scanf("%d%d",&n,&m);
	two[0]=1;
	for(int i=1;i<M;i++) two[i]=two[i-1]*2%mod;
	tot=1;        
	for(int i=1;i<=m;i++)
	{
		int x,y;
		scanf("%d%d",&x,&y);
		add_E(x,y),add_E(y,x);
		L[i]=x,R[i]=y;
	}
	tarjan(1,0);
	for(int i=1;i<=n;i++) if(!vis[i]) ++dcc,dfs(i);
	tot=0,memset(head,0,sizeof(head));
	for(int i=1;i<=m;i++)
	{
		int x=L[i],y=R[i];
		if(belong[x]==belong[y]) cntm[belong[x]]++;
		else add_E(belong[x],belong[y]),add_E(belong[y],belong[x]);
	}
	dep[1]=1,dfs2(1);
	pb::solve();
	return 0;
}