#include<bits/stdc++.h>
using namespace std;
int nxt[2000010],v[2000010],vis[1000010],fir[1000010],tot2;
int x[1000010],y[1000010],g[1000010];
void add(int x,int y){
	nxt[++tot2]=fir[x];
	v[tot2]=y;
	fir[x]=tot2;
}
void dfs(int x){
	vis[x]=true;
	for(int i=fir[x];i;i=nxt[i]){
		int y=v[i];
		if(vis[y])continue;
		dfs(y);
	}
	return;
}
int M=(1e9)+7;
int main(){
	freopen("barrack.in","r",stdin);
	freopen("barrack.out","w",stdout);
	ios::sync_with_stdio(0);
	cin.tie(0);cout.tie(0);
	long long n,m;
	cin>>n>>m;
	if(n<=16&&m<=25){
		int ans=0;
		for(int i=1;i<=m;i++)
		cin>>x[i]>>y[i];
		for(int i=1;i<(1<<n);i++){
			int tot=0;
			for(int j=0;j<n;j++){
				if(i>>j&1){
					g[++tot]=j+1;
				}
			}
			int sum=m;
			for(int j=1;j<=m;j++){
				tot2=0;
				for(int jj=1;jj<=m;jj++){
					if(j==jj)continue;
					add(x[jj],y[jj]);
					add(y[jj],x[jj]);
				}
				dfs(g[1]);
				int flag=true;
				for(int jj=2;jj<=tot;jj++)
				if(!vis[g[jj]])flag=false;
				for(int jj=1;jj<=n;jj++)
				vis[jj]=fir[jj]=0;
				if(!flag){
					sum--;
				}
			}
			ans=ans+(1<<sum);
			ans%=M;
		}
		cout<<ans<<"\n";
	}
	else{
		long long ss=1;
		for(int i=1;i<=n-2;i++){
			ss=ss*2;
			ss%=M;
		}
		long long tt=ss*2%M;
		ss=ss*((n)*(n-1)/2%M)%M;
		ss=(ss+tt*n%M)%M;
		cout<<ss<<"\n";
	}
	return 0;
}