#include<bits/stdc++.h>
#define ll long long
using namespace std;
inline int read(){
	int p=0,o=1;char c=getchar();
	while(c>'9'||c<'0'){if(c=='-')o=-1;c=getchar();}
	while(c<='9'&&c>='0'){p=p*10+c-'0';c=getchar();}
	return p*o;
}
ll mo=1000000007;
ll a,s,anss,ans[1000005];
ll ksm(ll z,ll x){ll re=1;
	for(;x;x/=2,z=(z*z)%mo)if(x&1)re=(re*z)%mo;
	return re;
}
struct data{int q,w;}d[1000005];
int fir[2000005],nex[2000005],son[2000005],tot;
void add(int z,int x){son[++tot]=x;nex[tot]=fir[z];fir[z]=tot;}
//void qiuqiu(int z,int x){
//	ans[z]=1;
//	for(int i=fir[z];i;i=nex[i])if(son[i]!=x)qiuqiu(son[i],z);
//	for(int i=fir[z];i;i=nex[i])if(son[i]!=x){
//		if()ans[z]
//	}
//}
bool scp(data z,data x){return z.q<x.q||z.q==x.q&&z.w<x.w;}
int main(){
	freopen("barrack.in","r",stdin);
	freopen("barrack.out","w",stdout);
	a=read();s=read();
	if(s==a-1){
		anss=1;
		for(int i=2;i<=a;i++)anss=(anss*3+i)%mo;
		printf("%lld",anss);
		/*for(int i=1;i<=s;i++){
			int z=read(),x=read();
			add(z,x);add(x,z);
		}
		qiuqiu(1,0);for(int i=1;i<=a;i++)anss+=ans[i];
		printf("%lld",anss);
		*/
		return 0;
	}
	for(int i=1;i<=s;i++){
		int z=read(),x=read();
		d[i].q=max(z,x);d[i].w=min(z,x);
	}
	sort(d+1,d+s+1,scp);int ml=1;
	for(int i=2;i<=a;i++){
		for(;d[ml].q==i;ml++)add(d[ml].q,d[ml].w),add(d[ml].w,d[ml].q);
		
	}
	printf("%lld",anss);
	return 0;
}
/*
2 1
1 2
*/
/*
4 4
1 2
2 3
3 1
1 4
*/