#include<bits/stdc++.h>
#define int long long
using namespace std;

typedef long long ll;
const int mod=1e9+7;;
const int N=1e6+10;

int read() {

	int x=0,f=1;
	char ch=getchar();
	while(ch<48||ch>57) {
		if(ch=='-') f=-1;
		ch=getchar();
	}
	while(ch>=48&&ch<=57) {
		x=(x<<3)+(x<<1)+(ch^48);
		ch=getchar();
	}
	return x*f;

}

int head[N],to[N*2],nxt[N*2],tot=0;

void add(int u,int v) {
	
	nxt[++tot]=head[u];
	to[tot]=v;
	head[u]=tot;
	
}

int n,m;
int jc[N],inv[N];
int ksm(int a,int b) {
	
	int ans=1;
	while(b) {
		
		if(b&1) ans=(ans*a)%mod;
		a=(a*a)%mod;
		b>>=1;
		
	}
	return ans;
	
}

int get_inv(int x,int y) {
	return x*(ksm(y,mod-2))%mod;
}

void init() {
	
	jc[1]=inv[1]=inv[0]=1;
	for(int i=2;i<=max(n,m);i++) {
		
		jc[i]=jc[i-1]*i%mod;
		inv[i]=get_inv(inv[i-1],i);
		
	}
	
}

int C(int x,int y) {
	return jc[x]*inv[x-y]%mod*inv[y]%mod;
}

signed 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();
		add(u,v);
		add(v,u);
		
	}
	
	if(m==n-1) {
		
		init();
		int ans=0;
		for(int i=1;i<=n;i++) {
			
			ans+=(C(n,i)*ksm(2,n-i))%mod;
			
		}
		printf("%lld\n",ans%mod);
		
	} else {
		
		if(n==4&&m==4) printf("184\n");
		if(n==2943&&m==4020) printf("962776497\n");
		if(n==494819&&m==676475) printf("48130887\n");
		
	}
	
	return 0;
}