#include<bits/stdc++.h>
using namespace std;
const int N=1e6+5;
const int p=1e9+7;
int vet[N],nxt[N],head[N];
int c[N],b[N];
int n,m,edgenum,sum;
int g[35][35];
bool vis[10];
void add(int u,int v)
{
	vet[++edgenum]=v;
	nxt[edgenum]=head[u];
	head[u]=edgenum;
}
void cqr(int u,int wh)
{
	//cout<<u<<endl;
//	system("pause");
	vis[u]=1;
	for (int e=head[u];e;e=nxt[e])
	{
		int v=vet[e];
		if (vis[v]==1||g[u][v]==wh) continue;
		cqr(v,wh);
	}
}
bool check()
{
	int i,j,k,A=0;
	for (i=1;i<=n;i++) A+=c[i];
	if (A==0) return false;
	for (i=1;i<=m;i++)
	{
		if (b[i]==1) continue;
		else 
		{
			for (j=1;j<=n;j++)
			{
				if (c[j]==1)
				{
					memset(vis,0,sizeof(vis));
					cqr(j,i);
					for (k=1;k<=n;k++)
					  if (c[k]==1&&vis[k]==0) return false;
				}
			}
		}
	}
	return true;
}
void dfs2(int d)
{
	int i;
	if (d>m)
	{
		if (check()) 
		{
		//	for (i=1;i<=n;i++) cout<<c[i]<<' ';cout<<endl;
		//	for (i=1;i<=m;i++) cout<<b[i]<<' ';cout<<endl;
			sum++;
		}
		sum%=p;
		return;
	}
	b[d]=1;
	dfs2(d+1);
	b[d]=0;
	dfs2(d+1);
}
void dfs1(int d)
{
	if (d>n)
	{
		dfs2(1);
		return;
	}
	c[d]=1;
	dfs1(d+1);
	c[d]=0;
	dfs1(d+1);
}
int main()
{
	freopen("barrack.in","r",stdin);
	freopen("barrack.out","w",stdout);
	int i,x,y;
	scanf("%d%d",&n,&m);
	for (i=1;i<=m;i++)
	{
		scanf("%d%d",&x,&y);
		g[x][y]=g[y][x]=i;
		add(x,y);
		add(y,x);
	}
	if (n<=8&&m<=10)
	{
	dfs1(1);
	cout<<sum;
	return 0;
	}
	return 0;
}
