#include <algorithm>
#include <iostream>
#include <string.h>
#include <stdio.h>
#include <math.h>
#include <queue>
#include <map>
#define prt printf
#define ll long long
#define int long long
#define spc prt(" ")
#define ent prt("\n")
using namespace std;
int read(){
int f = 1 , k = 0;
char c = getchar();
while(c < '0' || c > '9'){
if(c == '-') f = -1;
c = getchar() ;
}
while(c >= '0' && c <= '9'){
k = (k << 3) + (k << 1) + (c ^ 48);
c = getchar() ;
}
return (f == 1 ? k : -k);
}
void output(int now){
if(now > 9) output(now / 10);
putchar((now % 10) ^ 48);
}
int mn(int a , int b) { return a < b ? a : b ;}
const int maxn = 1e5 + 1 , mod = 1e9 + 7;
map<int , map<int , int > > G;
int n , m , ans = 0 , g , g2;
int cnt = 0 , h[maxn];
int vis[maxn] , d[maxn] , in[maxn] , team[maxn] , vist[maxn] , cl = 0;
struct edge{
int next , to;
}e[maxn << 1];
void add(int u , int v){
e[++ cnt].next = h[u];
e[cnt].to = v;
h[u] = cnt;
}
int dfs(int u , int fa){
if(vis[u] != 0) return 0;
vis[u] = 1 ; int dv = 0 ; ++ g2;
if(in[u] == false) ++ g;
else if(vist[team[u]] == false){
vist[team[u]] = 1;
++ g;
}
for(int i=h[u] ; i ; i=e[i].next){
int v = e[i].to ;
if(v == fa) continue ;
dv += dfs(v , u) ;
dv += 1;
}
return dv;
}
void df(int u , int fa , int num){
vist[u] = true ; team[u] = num;
for(int i=h[u] ; i ; i=e[i].next){
int v = e[i].to;
if(vist[v] == true || in[v] == false || v == fa) continue ;
df(v , u , num);
}
}
void top(){
queue<int> q ;
for(int i=1 ; i<=n ; i++) if(d[i] <= 1) q.push(i) , in[i] = false ;
while(! q.empty()){
int u = q.front() ; q.pop() ;
for(int i=h[u] ; i ; i=e[i].next){
int v = e[i].to;
-- d[v];
if(d[v] == 1) q.push(v) , in[i] = false;
}
}
}
signed main(){
n = read() , m = read() ;
for(int i=1 ; i<=m ; i++){
int u = read() , v = read() ;
if(G[u][v] == 1) continue;
G[u][v] = G[v][u] = 1;
add(u , v) ; add(v , u);
++ d[u] , ++ d[v];
}
for(int i=1 ; i<=n ; i++) in[i] = true;
top();
for(int i=1 ; i<=n ; i++){
if(in[i] == false || vist[i] == true) continue;
df(i , i , ++ cl);
}
memset(vist , 0 , sizeof vist) ;
for(int i=1 ; i<=n ; i++){
if(! vis[i]){
g = g2 = 0 ; int f = dfs(i , i);
if(f > g2){
putchar('0');
return 0;
}
else if(f == g) ans *= 1;
else ans = (ans > 0 ? ans : 1) * g ;
ans %= mod;
}
}
output(ans);
return 0;
}