#include <bits/stdc++.h>
using namespace std;
long long Mod=1e9+7;
int head[500005],_next[2000005],to[2000005];
bool musts[30];
bool vis[30];
int dis;
long long ptwo[500005];
bool jy[30];
long long ans=0;
int totle=0;
int n,m;
void link(int x,int y){
	_next[++totle]=head[x];
	head[x]=totle;
	to[totle]=y;
	_next[++totle]=head[y];
	head[y]=totle;
	to[totle]=x;
}
void dfs(int p){
	for(int i=head[p];i;i=_next[i]){
		if((i+1)/2==dis){
			continue;
		}
		if(!vis[to[i]]){
			vis[to[i]]=true;
			dfs(to[i]);
		}
	}
}
bool xzA=true;
int main(){
	freopen("barrack.in","r",stdin);
	freopen("barrack.out","w",stdout);
	cin>>n>>m;
	if(m!=n-1)xzA=false;
	for(int i=1;i<=m;i++){
		int x,y;
		scanf("%d%d",&x,&y);
		if(abs(x-y)!=1)xzA=false;
		link(x,y);
	}
	if(xzA){
		ptwo[0]=1;
		for(int i=1;i<=n;i++){
			ptwo[i]=(ptwo[i-1]*2)%Mod;
		}
		for(int i=1;i<=n;i++){
			ans=(ans+(n-i+1)*(ptwo[max(0,i-2)])%Mod*ptwo[n-i]%Mod)%Mod;
		}
		printf("%lld\n",ans%Mod);
		return 0;
	}
	ans=0;
	for(int zt=1;zt<=(1<<n)-1;zt++){
		int nms=0;
		for(int i=1;i<=n;i++){
			if(zt&(1<<(i-1))){
				jy[i]=1;
				nms++;
			}else jy[i]=0;
		}
		memset(musts,0,sizeof(musts));
		for(int i=1;i<=m;i++){
			dis=i;
			memset(vis,0,sizeof(vis));
			for(int j=1;j<=n;j++){
				if(jy[j]){
					vis[j]=1;
					dfs(j);
					break;
				}
			}
			for(int j=1;j<=n;j++){
				if(jy[j]&&!vis[j]){
					musts[i]=true;
					break;
				}
			}
		}
		long long nowans=1;
		for(int i=1;i<=m;i++){
			if(!musts[i]){
				nowans=nowans*2%Mod;
			}
		}
		ans=(ans+nowans)%Mod;
	}
	printf("%lld\n",ans%Mod);
}
