#include<bits/stdc++.h>
using namespace std;
int n,m;
long long mod=1000000007;
int read() {
	int res=0;
	char x;
	x=getchar();
	while(x<'0'||x>'9') {
		x=getchar();
	}
	while(x>='0'&&x<='9') {
		res=res*10+x-'0';
		x=getchar();
	}
	return res;
}
long long cf(int x) {
	long long i=2;
	long long res=1;
	while(x) {
		if(x&1) {
			res*=i;
			res%=mod;
		}
		i=i*i;
		i%=mod;
		x/=2;
	}
	return res;
}
long long ans=0;
int tot=0;
int fir[500005],son[2000006],nxt[2000005];
void add(int x,int y) {
	tot++;
	son[tot]=y;
	nxt[tot]=fir[x];
	fir[x]=tot;
}
int dfn[500005],low[500005];
int res=0;
int opop=0;
void dfs(int x,int fa) {
	if(dfn[x]) {
		low[fa]=dfn[x];
		return ;
	}
	res++;
	dfn[x]=res;
	low[x]=res;
	for(int i=fir[x]; i; i=nxt[i]) {
		if(son[i]!=fa) {
			dfs(son[i],x);
		}
	}
	for(int i=fir[x]; i; i=nxt[i]) {
		if(son[i]!=fa) {
			low[x]=min(low[x],low[son[i]]);
		}
	}
	if(dfn[x]==low[x])opop++;
	return ;
}
long long jz[500005],in[500005];
long long C(long long x,long long y){
	if(y>x)return 0;
	return ((jz[x]*in[y])%mod*in[x-y])%mod;
}
int main() {
	freopen("barrack.in","r",stdin);
	freopen("barrack.out","w",stdout);
	n=read();
	m=read();
	for(int i=1; i<=m; i++) {
		int s,t;
		s=read();
		t=read();
		add(s,t);
		add(t,s);
	}
	in[0]=in[1]=jz[0]=jz[1]=1;
	for(int i=2; i<=n; i++) {
		in[i]=in[mod%i]*(mod-(mod/i));
		in[i]%=mod;
		jz[i]=jz[i-1]*i;
		jz[i]%=mod;
	}
	for(int i=1; i<=n; i++) {
		in[i]*=in[i-1];
		in[i]%=mod;
	}
	dfs(1,0);
	opop--;
	if(m==n-1)opop=m;
	for(int i=0; i<=opop; i++) {
		if(i&1) {
			ans=ans-(C(opop,i)*(cf(n-i)-1)%mod*(cf(m-i)));
			ans=(ans+mod)%mod;
		} else {
			ans=ans+(C(opop,i)*(cf(n-i)-1)%mod*(cf(m-i)));
			ans=(ans+mod)%mod;
		}
	}
	cout<<ans;
	return 0;
}