#include<bits/stdc++.h>
using namespace std;
const int N=5e5+5;
vector<int> cj[N];
int n,m,u,v;
int num[N],low[N];
int dnf,sum;
//bool CJ[3000][3000]={false};
const int MOD=1000000007;
void dfs(int s,int fa){
	num[s]=low[s]=++dnf;
	for(int i=0;i<cj[s].size();i++){
		int v=cj[s][i];
		if(!num[v]){
			dfs(v,s);
			low[s]=min(low[s],low[v]);
			if(low[v]>num[s]){
				//CJ[v][s]=CJ[s][v]=true;
				sum++;
			}
		}
		else if(v!=fa && num[v]<num[s])
			low[s]=min(low[s],num[v]);
	}
	return ;
}
long long vis[N];
long long jie(int n){
	if(n<=1)return 1;
	return vis[n]==0? vis[n]=jie(n-1)*n:vis[n];
}
long long C(int n,int m){
	return jie(n)/jie(m)/jie(n-m);
}
int main(){
	freopen("barrack.in","r",stdin);
	freopen("barrack.out","w",stdout);
	cin.tie(0);
	cout.tie(0);
	cin>>n>>m;
	if(n<=3000){
		for(int i=0;i<m;i++){
			cin>>u>>v;
			cj[u].push_back(v);
			cj[v].push_back(u);
		}
		dfs(1,-1);
		if(sum==0){
			long long  ans=0;
			for(int i=1;i<=n;i++)
				ans+=C(n,i)%MOD;
			ans%=MOD;
			cout<<ans;
		}
		else{
			cout<<1;
		}
	}
	else if(m==n-1){
		long long  ans=0;
			for(int i=1;i<=n;i++)
				ans+=C(n,i)%MOD;
			ans%=MOD;
			cout<<ans;
	}
	else
		cout<<1;
	return 0;
}