#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int MOD = 1e9+7;
const int MAXN = 5e5+5;
bool CYL;
vector <int> e[MAXN],g[MAXN];
int n,m,dfn[MAXN],low[MAXN],cnt,fa[MAXN],bri[MAXN],lca[30][30],dep[MAXN];
ll P[MAXN*2],dp[3005][5005],Ans;
bool vis[MAXN];
bool Godd;
void dfs(int p,int pre)
{
	dfn[p]=low[p]=++cnt;vis[p]=1;fa[p]=pre;dep[p]=dep[pre]+1;
	for(int i=0;i<e[p].size();++i)
	{
		int to=e[p][i];
		if(!vis[to])
		{
			dfs(to,p);
			low[p]=min(low[p],low[to]);
			if(low[to]==dfn[to]) bri[to]=1;
		}
		else if(to!=pre) low[p]=min(low[p],dfn[to]);
	}
}
int LCA(int u,int v)
{
	while(u!=v)
	{
		if(dep[u]<dep[v]) swap(u,v);
		u=fa[u];
	}
	return u;
}
int main()
{
//	cout<<1.0*(&Godd-&CYL)/1024/1024<<"MB"<<endl;
	freopen("barrack.in","r",stdin);
	freopen("barrack.out","w",stdout);
	scanf("%d %d",&n,&m);
	for(int i=1;i<=m;++i)
	{
		int u,v;scanf("%d %d",&u,&v);
		e[u].push_back(v);
		e[v].push_back(u);
	}
	P[0]=1;
	for(int i=1;i<=m;++i) P[i]=P[i-1]*2%MOD;
	dfs(1,0);
	memset(vis,0,sizeof vis);
	for(int i=1;i<=n;++i)
		for(int j=i+1;j<=n;++j) lca[i][j]=lca[j][i]=LCA(i,j);
	for(int i=1;i<=n;++i) lca[i][0]=lca[0][i]=i;
	
//	cout<<"bri:"<<bri[2]<<" "<<low[2]<<" "<<dfn[2]<<endl;
	
	for(int i=1;i<(1<<n);++i)
	{
		int faa=0;
		for(int j=1;j<=n;++j)
			if((1<<(j-1))&i) faa=lca[faa][j];
		int cnt=0;
		for(int j=1;j<=n;++j) vis[j]=0;
		for(int j=1;j<=n;++j)
		{
			if((1<<(j-1))&i)
			{
				int u=j;
				while(u!=faa)
				{
					cnt+=(vis[u]!=1)*bri[u];vis[u]=1;
					u=fa[u];
				}
			}
		}
		
//		cout<<"cnt:"<<cnt<<" "<<faa<<endl;
		
		Ans=(Ans+P[m-cnt])%MOD;
	}
	printf("%lld\n",Ans);
	return 0;
}
