#include<bits/stdc++.h>
using namespace std;
const int MAXN=5010;
const int mod=1e9+7;
const int inf=0x3f3f3f3f;

inline int read() {
	int flag=1,sum=0;
	char ch;
	while(!isdigit(ch)) {
		if(ch=='-') flag=-1;
		ch=getchar();
	}
	while(isdigit(ch)) {
		sum=(sum<<3)+(sum<<1)+(ch^48);
		ch=getchar();
	}
	return flag*sum;
}

//struct Node {
//	int to,nxt;
//} edge[MAXN*2];
//int head[MAXN*2],idx=0;
//inline void add(int x,int y) {
//	edge[++idx].to=y;
//	edge[idx].nxt=head[x];
//	head[x]=idx;
//}
int flagg[20];
int idx=0;
int e[20][20],nu,n,m,flaggg;
long long ans=0;
struct node {
	int flag;
	int u,v;
} f[30];

inline void sol_1() {

	return ;
}

inline void check(int num) {
	if(num==m+1) {
//		for(int i=1; i<=m; i++) {
//			cout<<f[i].flag<<" ";
//		}
//		cout<<endl;

		for(int i=1; i<=n; i++) {
			for(int j=1; j<=n; j++) {
				if(i==j) e[i][j]=inf;
				else e[i][j]=0;
			}
		}

		for(int i=1; i<=m; i++) {
			e[f[i].u][f[i].v]=e[f[i].v][f[i].u]=1;
		}

		for(int i=1; i<=m; i++) {
			if(f[i].flag==1) {
				for(int k=1; k<=n; k++) {
					for(int i=1; i<=n; i++) {
						for(int j=i; j<=n; j++) {
							e[i][j]=e[j][i]=min(e[i][k]+e[k][j],e[i][j]);
						}
					}
				}
				int flagggg=0;
				for(int i=1; i<=nu; i++) {
					for(int j=i+1; j<=nu; j++) {
						if(e[flagg[i]][flagg[j]]==inf) {
							flagggg=1;
							break;
						}
					}
					if(flagggg==1) {
						break;
					}
				}
				if(flagggg==0) {
					ans++;
					ans%=mod;
				}

				for(int i=1; i<=n; i++) {
					for(int j=1; j<=n; j++) {
						if(i==j) e[i][j]=inf;
						else e[i][j]=0;
					}
				}

				for(int i=1; i<=m; i++) {
					e[f[i].u][f[i].v]=e[f[i].v][f[i].u]=1;
				}
			} else {
				e[f[i].u][f[i].v]=e[f[i].v][f[i].u]=inf;
				for(int k=1; k<=n; k++) {
					for(int i=1; i<=n; i++) {
						for(int j=i; j<=n; j++) {
							e[i][j]=e[j][i]=min(e[i][k]+e[k][j],e[i][j]);
						}
					}
				}
				int flagggg=0;
				for(int i=1; i<=nu; i++) {
					for(int j=i+1; j<=nu; j++) {
						if(e[flagg[i]][flagg[j]]==inf) {
							flagggg=1;
							break;
						}
					}
					if(flagggg==1) {
						break;
					}
				}
				if(flagggg==0) {
					ans++;
					ans%=mod;
				}

				for(int i=1; i<=n; i++) {
					for(int j=1; j<=n; j++) {
						if(i==j) e[i][j]=inf;
						else e[i][j]=0;
					}
				}

				for(int i=1; i<=m; i++) {
					e[f[i].u][f[i].v]=e[f[i].v][f[i].u]=1;
				}
			}
		}

//		for(int i=1; i<=n; i++) {
//			for(int j=1; j<=n; j++) {
//				cout<<e[i][j]<<" ";
//			}
//			cout<<endl;
//		}
		return ;
	}
	check(num+1);
	f[num].flag=1;
	check(num+1);
	f[num].flag=0;

	return ;
}
inline void dfs(int u) {
	if(u==n+1) {
		if(nu==0) return ;
		else if(nu==1) ans+=pow(2,m),ans%=mod;
		else {
			check(1);
		}
		return ;
	}
	dfs(u+1);
	flagg[++nu]=u;
	dfs(u+1);
	nu--;
}
inline void sol_2() {
	dfs(1);
	cout<<ans;

	return ;
}
signed main() {
	freopen("barrack.in","r",stdin);
	freopen("barrack.out","w",stdout);

	n=read();
	m=read();
	int flag=0;
//	for(int i=1;i<=n;i++){
//		for(int j=1;j<=m;j++){
//			if(i==j) f[i][j]=0;
//			else f[i][j]=inf;
//		}
//	}
	for(int u,v,i=1; i<=m; i++) {
		u=read();
		v=read();
		if(u!=v-1) flag=1;
		f[i].u=u;
		f[i].v=v;
	}
//	if(m==n-1 && flag==0){
//		sol_1();
//	}
//	else {
	sol_2();
//	}

	return 0;
}