#include<bits/stdc++.h>

using namespace std;
typedef long long ll;
const int N=5e5+10,M=1e6+10,mod=1e9+7;
struct node{
	int a,b;
}road[M];
int n,m;
bool is_A=true;
int idx,h[N],e[M],ne[M];
int fact[M];
bool vis[N];

void add(int a,int b){
	e[idx]=b;
	ne[idx]=h[a];
	h[a]=idx++;
}

void init(){
	fact[0]=1;
	for(int i=1;i<=m;i++) fact[i]=(ll)fact[i-1]*2%mod;
}

bool check(int u){
	if(u==1&&vis[1]){
		return true;
	}
	vis[u]=true;
	for(int i=h[u];~i;i=ne[i]){
		if(!vis[e[i]]) check(e[i]);
	}
}

int main(){
	freopen("barrack.in","r",stdin);
	freopen("barrack.out","w",stdout);
	memset(h,-1,sizeof h);
	memset(vis,0,sizeof vis);
	scanf("%d%d",&n,&m);
	init();
	ll ans=0;
	if(m!=n-1) is_A=false;
	for(int i=1;i<=m;i++){
		int a,b;
		scanf("%d%d",&a,&b);
		road[i]={a,b};
		if(!((a==i&&b==i+1)||(a==i+1&&b==i))) is_A=false;
		add(a,b);add(b,a);
	}
	if(is_A){
		ans=(ll)n*fact[m]%mod;
		int i=2,j=m-1;
		for(i=2,j=m;j>1;i++,j--){
			ans=(ans+(ll)j*fact[j-1]%mod*fact[i-2]%mod)%mod;
		}
		if(n>2) ans=(ans+(ll)fact[n-2])%mod;
		else ans=(ans+1)%mod;
		printf("%lld\n",ans);
		return 0;
	}
	ans=(ll)n*fact[m]%mod;
	if(n==m&&check(1)){
		for(int i=2,j=m;i<n;i++,j--){
			ans=(ans+(ll)m*(fact[j-1]*fact[i-2]%mod+fact[m-j+1]*fact[n-i]%mod)%mod)%mod;
		}
		ans=(ans+1)%mod;
		printf("%lld\n",ans);
		return 0;
	}
}