#include<bits/stdc++.h>
#define rr return
#define RS 500010
#define ll long long 
#define f(a,b,c) for(int c=a;c<=b;c++)
#define ff(a,b,c) for(int c=a;c>=b;c--)
using namespace std;
const int mod = 1e9+7;
const int inf = 2e9;
#define gc getchar
int rd(){
	int v=1,w=0;
	char c=gc();
	while(c<'0'||c>'9'){
		if(c=='-') v=-1;
		c=gc();
	}
	while(c>='0'&&c<='9'){
		w=(w<<1)+(w<<3)+(c&15);
		c=gc();
	} rr v*w;
}
int n,m,ut[RS],vt[RS],cnt=1,h[RS],f1[RS],f2[RS],ft[RS]; ll ans;
struct nd{ int v,nt;}e[RS];
void add(int u,int v){ e[++cnt].v=v; e[cnt].nt=h[u]; h[u]=cnt;}
int num[RS],low[RS],col[RS],stk[RS],tp,ct,co,sz1[RS],sz2[RS];
void tar(int u,int la){
	num[u]=low[u]=++ct;
	stk[++tp]=u;
	for(int i=h[u];i;i=e[i].nt){
		if(i!=(la^1)){
			int v=e[i].v;
			if(!num[v]){
				tar(v,i);
				low[u]=min(low[u],low[v]);
			}else if(!col[v]){
				low[u]=min(low[u],num[v]);
			}
		}
	}
	if(num[u]==low[u]){
		co++;
		do{
			sz1[co]++;
			col[stk[tp--]]=co;
		}while(stk[tp+1]!=u);
	}
}
ll ksm(int a,int b){
	ll ans=1;
	while(b){
		if(b&1){
			ans=ans*a%mod;
		}
		a=a*a%mod;
		b>>=1;
	} rr ans;
}
signed main(){
	freopen("barrack.in","r",stdin);
	freopen("barrack.out","w",stdout);
	n=rd(); m=rd();
	f(1,m,i){
		ut[i]=rd();
		vt[i]=rd();
		add(ut[i],vt[i]);
		add(vt[i],ut[i]);
	}
	f(1,n,i) if(!num[i]) tar(i,-1);
	f(1,m,i){ int c=col[ut[i]];
		if(c==col[vt[i]]) sz2[c]++;
	}
//	f(1,co,i) cout<<sz1[i]<<' '; cout<<endl;
//	f(1,co,i) cout<<sz2[i]<<' '; cout<<endl;
	f(1,co,i) f1[i]=(ksm(2,sz1[i])-1)*ksm(2,sz2[i])%mod,f2[i]=ksm(2,sz2[i]);
//	f(1,co,i) cout<<f1[i]<<' '; cout<<endl;
//	f(1,co,i) cout<<f2[i]<<' '; cout<<endl;
	rr 0;
}/*
5 5
1 2
1 3
2 3
3 4
4 5
*//*
4 4
1 2
2 3
3 1
1 4
*/