#include<bits/stdc++.h>
using namespace std;
namespace ye
{
#define int long long
#define sd(x) cout<<#x<<'='<<x<<endl
const int N=17,M=26,mod=1e9+7;
int read()
{
	int x=0,f=1;char c=getchar();
	for(;!isdigit(c);c=getchar())if(c=='-')f=-1;
	for(;isdigit(c);c=getchar())x=(x<<3)+(x<<1)+c-48;
	return x*f;
}
struct node{
	int u,v;
};	
node e[M];
bool d[N],b[N];
int n,m,ans;
int fa[N],p[1000006];
vector<int>a,nw;
int find(int x)
{
	if(x==fa[x])
		return x;
	return fa[x]=find(fa[x]);
}
void dfsb(int cur)
{
	if(cur>m)
	{
		a=nw;
		for(int i=1;i<=n;i++)
			if(d[i])
				a.push_back(i);
		if(a.size()==0)
			return;
		for(int i=1;i<=n;i++)
			fa[i]=i;
		for(int i=1;i<=m;i++)
			if(b[i])
				fa[find(e[i].u)]=find(e[i].v);
		int tar=find(a[0]);
		bool flag=1;
		for(int i=1;i<a.size();i++)
		{
			if(find(a[i])!=tar)
			{
				flag=0;
				break;
			}
		}
		if(flag)
		{
			ans=(ans+1)%mod;
			int tmp=0;
			for(int i=1;i<=n;i++)
				if(d[i])
					tmp++;
		}
	//	else
		return;
	}
	b[cur]=1;
	dfsb(cur+1);
	b[cur]=0;
	dfsb(cur+1);
}
void dfsd(int cur)
{
	if(cur>n)
	{
		dfsb(1);
		return;
	}
	d[cur]=1;
	dfsd(cur+1);
	d[cur]=0;
	dfsd(cur+1);
}
void solvelian()
{
	p[0]=1;
	for(int i=1;i<=n;i++)
		p[i]=p[i-1]*2%mod;
	ans=n*p[n-1]%mod+n*(n-1)%mod*p[n-3]%mod;
}
void solve()
{
	n=read();m=read();
	if(m==n-1&&n>=3)
		solvelian();
	else
	{
		for(int i=1;i<=m;i++)
		{
			e[i].u=read();
			e[i].v=read();
		}
		dfsd(1);
	}
	printf("%lld",ans%mod);
}
}
signed main()
{
	freopen("barrack.in","r",stdin);
	freopen("barrack.out","w",stdout);
	ye::solve();
	return 0;
}
