#include<bits/stdc++.h>
using namespace std;
const int N=1e2+10;
const int mod=1e9+7;
int n,m;
int a[N],tot;
int mp[N][N];
int x[N],y[N],vis[N];
int ans;
void check() {
	memset(mp,0,sizeof mp);
	for(int i=1; i<=m; i++)
		if(vis[i])
			mp[x[i]][y[i]]=mp[y[i]][x[i]]=1;


	for(int k=1; k<=n; k++)
		for(int i=1; i<=n; i++)
			for(int j=1; j<=n/2+1; j++)
				if(mp[i][k]&&mp[k][j])
					mp[i][j]=mp[j][i]=1;

	for(int i=1; i<=tot; i++)
		for(int j=1; j<=tot; j++)
			if(!mp[a[i]][a[j]]&&i!=j)
				return ;
	ans=(ans+1)%mod;

}
void get(int x) {
	if(x>m) {
		check();
		return ;
	}
	vis[x]=1;
	get(x+1);
	vis[x]=0;
	get(x+1);
}
void doo(int x) {
	if(x>n) {
		if(tot)
			get(1);
		return ;
	}
	a[++tot]=x;
	doo(x+1);
	tot--;
	doo(x+1);
}
signed main() {
	freopen("barrack.in","r",stdin);
	freopen("barrack.out","w",stdout);
	cin>>n>>m;
	for(int i=1; i<=m; i++)
		cin>>x[i]>>y[i];
	doo(1);
	cout<<ans;

	return 0;
}
/*
2 1
1 2

5

4 4
1 2
2 3
3 1
1 4

184
*/
