#include<bits/stdc++.h>
using namespace std;
#define LL long long
const LL P=1e9+7;
//struct edge{
//	int nxt,to;
//}e[10086];
//int fir[10086],tot=0;
bool flag=true;
LL n,m;
//void add(int x,int y){
//	e[++tot].nxt=fir[x];
//	e[tot].to=y;
//	fir[x]=tot;
//}
LL Pow(LL x,LL y){
	LL res=1;
	while(y){
		if(y&1){
			res=res*x%P;
		}
		y>>=1;
		x=x*x%P;
	}
	return res;
}
int main(){
	freopen("barrack.in","r",stdin);
	freopen("barrack.out","w",stdout);
	scanf("%lld%lld",&n,&m);
	for(int i=1;i<=m;i++){
		int u,v;
		scanf("%d%d",&u,&v);
		if((u!=v-1)&&(v!=u-1)){
			flag=false;
		}
//		add(u,v);
//		add(v,u);
	}
	LL ans;
	if((m==n-1)&&flag){
		ans=0;
		for(int i=0;i<=m;i++){
			ans=(ans+Pow(2,m-i)*(n-i)%P)%P;
		}
	}
	else{
		ans=(Pow(2,n))*(Pow(2,m))%P;
	}
	printf("%lld\n",ans);
	return 0;
}