#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int MAXN=500010;
const int MAXM=1000010;
const ll MOD=1e9 +7;
int n,m;
vector<int>g[MAXN];
ll qpow(int x,int k)
{
	ll res=1;
	ll now=x;
	while(k>0)
	{
		if(k&1) res=(res*now)%MOD;
		now=(now*now)%MOD;
		k>>=1;
	}
	return res;
}

int s[MAXM],t[MAXM];
bool usedn[MAXN],usedm[MAXM];
int fa[MAXN];
ll tot=0;
int find(int x)
{
	if(fa[x]==x) return x;
	fa[x]=find(fa[x]);
	return fa[x];
}
bool check()
{
//	for(int x1=1;x1<=n;x1++) printf("%d ",usedn[x1]);
//	for(int x1=1;x1<=m;x1++) printf("%d ",usedm[x1]);
	
	bool tag=0;
	for(int x1=1;x1<=n;x1++)
		if(usedn[x1]) tag=1;
	if(tag==0) return 0;
	
	for(int atk=1;atk<=m;atk++)
	{
		for(int x1=1;x1<=n;x1++) fa[x1]=x1;
		for(int x1=1;x1<=m;x1++)
			if(x1!=atk || (x1==atk && usedm[atk]))
			{
				int u=s[x1],v=t[x1];
				if(find(fa[u])!=find(fa[v])) fa[find(fa[u])]=find(fa[v]);
			}
		int rfa=-1;
		for(int x1=1;x1<=n;x1++)
			if(usedn[x1])
			{
				if(rfa==-1) rfa=find(fa[x1]);
				else
				{
					if(find(fa[x1])!=rfa) return 0;
				}
			}
	}
	return 1;
}
void dfsm(int now)
{
	if(now==m+1)
	{
		if(check()) tot++;
		return ;
	}
	dfsm(now+1);
	usedm[now]=1;
	dfsm(now+1);
	usedm[now]=0;
}
void dfsn(int now)
{
	if(now==n+1)
	{
		dfsm(1);
		return ;
	}
	dfsn(now+1);
	usedn[now]=1;
	dfsn(now+1);
	usedn[now]=0;
}

int main()
{
	freopen("barrack.in","r",stdin);
	freopen("barrack.out","w",stdout);
	scanf("%d %d",&n,&m);
	for(int x1=1;x1<=m;x1++)
	{
		int u,v;
		scanf("%d %d",&u,&v);
		s[x1]=u,t[x1]=v;
		g[u].push_back(v);
		g[v].push_back(u);
	}
	if(m==n-1)
	{
		ll ans=0;
		for(int len=0;len<=n-1;len++)
		{
			int p=n-len;
			int q=m-len;
			ans=(ans+p*qpow(2,q))%MOD;
		}
		printf("%lld\n",ans);
		return 0;
	}
	if(n<=8)
	{
		dfsn(1);
		printf("%lld\n",tot%MOD);
	}
	return 0;
}
