#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
inline int read(){
	int x=0,f=1;char c=getchar();
	for(;!isdigit(c);c=getchar())if(c=='-')f=-1;
	for(;isdigit(c);c=getchar())x=(x<<3)+(x<<1)+(c^48);
	return x*f;
}
const int mod=1e9+7;
map<ll,map<ll,ll> >c;
ll C(int n,int m){
	if(n<m)return 0;
	if(n==m||m==0)return 1;
	if(c[n][m])return c[n][m];
	return c[n][m]=(C(n-1,m)+C(n-1,m-1))%mod;
}
int n,m;
ll ans,CC;
vector<int>f[500005];
int g[3001][3001],ci,w,st,Ed,ci2;
bool vis[3001],pd[3001],flag,pd2[3001],flag2;
void dfs_0(int x){
	if(flag2)return;
	if(ci2==w-1){
		flag2=1;
		return;
	}
	for(int y:f[x]){
		if(pd2[y])continue;
		if(g[x][y]==999)continue;
		pd2[y]=1;
		if(vis[y])ci2++;
		dfs_0(y);
		pd2[y]=0;
		if(vis[y])ci2--;
	}
	return;
}
void dfs(int x){
	if(flag)return;
	if(ci==w-1){
		flag=1;
		return;
	}
	for(int y:f[x]){
		if(pd[y])continue;
		pd[y]=1;
		if(vis[y])ci++;
		dfs(y);
		if(flag&&g[x][y]>=0){
			ci2=0;
			flag2=0;
			g[x][y]=g[y][x]=999;
			dfs_0(st);
			g[x][y]=g[y][x]=1;
			if(!flag2)Ed++;
		}
		pd[y]=0;
		if(vis[y])ci--;
	}
	return;
}
void work_1(){
	int r=1<<n;
	for(int i=1;i<r;i++){
		w=0;
		flag=0,st=0;
		for(int j=0;j<n;j++){
			if(i&(1<<j))vis[j+1]=1,w++,st=st?st:j+1;
		}
		if(w==1)continue;
		pd[st]=1;
		pd2[st]=1;
		Ed=0;
		dfs(st);
		pd[st]=0;
		pd2[st]=0;
		if(!Ed)ans=(ans+CC)%mod;
		else for(int i=0;i<=m-Ed;i++){
			ans=(ans+C(m-Ed,i))%mod;
		}
//		for(int i=1;i<=n;i++){
//			if(vis[i])printf("%d ",i);
//		}
//		printf("%lld\n",ans);
		memset(vis,0,sizeof(vis));
	}
}
int main(){
	freopen("barrack.in","r",stdin);
	freopen("barrack.out","w",stdout);
	n=read(),m=read();
	for(int i=1;i<=m;i++){
		int u=read(),v=read();
		f[u].push_back(v);
		f[v].push_back(u);
		if(n<=3000){
			if(!g[u][v])g[u][v]=g[v][u]=1;
			else g[u][v]=g[v][u]=-9000;
		}
	}
	for(int i=0;i<=m;i++){
		CC=(CC+C(m,i))%mod;
	}
	ans=CC*n%mod;
	if(n<=3000&&m<=5000){
		work_1();
	}else{
		for(int i=1;i<n;i++){
			ll CQ=0;
			for(int j=0;j<=m-i;j++){
				CQ=(CQ+C(m-i,j))%mod;
			}
			ans=(ans+(n-i)*CQ)%mod;
		}
	}
	printf("%lld",ans);
	fclose(stdin);
	fclose(stdout);
	return 0;
}
