#include <bits/stdc++.h>
using namespace std;
const int mod=1e9+7,N=5e5+5,M=1e6+5;
int nxt[M<<1],to[M<<1],head[M<<1],num,cnt,n,m,l[M],r[M],vis[N];
bool b[M],a[N];
long long ans;
void add(int u,int v)
{
	nxt[++num]=head[u];
	head[u]=num;
	to[num]=v;
}
void bfs(int boo,int u)
{
	int i;
	queue<int> Q;
	
	Q.push(u);
	vis[u]=cnt;
//	cout<<u<<' ';
	while (!Q.empty())
	{
		int x=Q.front();
//		cout<<x<<' ';
		Q.pop();
		for (i=1;i<=m;i++)
		if ((l[i]==x||r[i]==x)&&(i!=boo||i==boo&&b[i]==1))
		{
			int y;
			if (l[i]==x) y=r[i];
			if (r[i]==x) y=l[i];
			if (!vis[y])
			{
				vis[y]=cnt;
				Q.push(y);
			}
		}
	}

//	for (i=1;i<=m;i++) cout<<b[i]<<' ';cout<<endl;
//	for (i=1;i<=n;i++) cout<<vis[i]<<' ';cout<<endl;
//	cout<<endl;
}
bool check()
{
	int i,j,ii;
	
	for (ii=1;ii<=m;ii++)
	{
//		cout<<ii<<endl;
//		num=0;
//		memset(head,0,sizeof(head));
//		memset(to,0,sizeof(to));
//		memset(nxt,0,sizeof(nxt));
//		for (j=1;j<=m;j++) 
//		if (j!=ii||j==ii&&b[ii]==1) add(l[j],r[j]),add(l[j],r[j]);
		
		cnt=0;
		memset(vis,0,sizeof(vis));
		
		for (i=1;i<=n;i++)
		if (!vis[i]) 
		{
			++cnt;
			bfs(ii,i);
		}
		
		for (i=1;i<=n;i++)
		for (j=i+1;j<=n;j++)
		if (a[i]&&a[j]&&vis[i]!=vis[j]) return 0;
	}
	return 1;
}
void dfs2(int k,int s2)
{
	if (k>m)
	{
		if (s2==m)
		{
			ans++;
			return;
		}
		if (check()) ans++;
		return;
	}
	
	dfs2(k+1,s2);
	b[k]=1;
	dfs2(k+1,s2+1);
	b[k]=0;
}
void dfs1(int k,int s)
{
	if (k>n)
	{
		if (s>1) dfs2(1,0); else if (s==1) ans+=(1<<m);
		return;
	}
	
	dfs1(k+1,s);
	a[k]=1;
	dfs1(k+1,s+1);
	a[k]=0;
}
int main()
{
	freopen("barrack.in","r",stdin);
	freopen("barrack.out","w",stdout);
	
	int i;
	
	cin>>n>>m;
	for (i=1;i<=m;i++)	scanf("%d%d",&l[i],&r[i]);
	
if (n<=8&&m<=10)
{
	dfs1(1,0);
	cout<<ans%mod;
}
	
	return 0;
}
