#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
const int mod=989381;
const int maxn=500010;
int num1,num2,n,m,s[maxn][3],cnt[maxn],num[maxn],fac[maxn],flag=true,vis[maxn];
void dfs(int x,int y,int z){
if(flag==false) return;
vis[x]=true;
if(z==0){
++num1;
if(s[x][1]){
if(vis[s[x][1]]){
flag=false; return ;
}
num[s[x][1]]++; num2--; dfs(s[x][1],x,1);
}
if(s[x][2]){
if(vis[s[x][2]]){
flag=false; return ;
}
num[s[x][2]]++; --num2; dfs(s[x][2],x,2);
}
}
else{
if(z==1){
if(cnt[x]==2){
num[s[x][1]]++; num[s[x][2]]++;
if(s[x][1]!=y&&s[x][2]!=y){
flag=false; return;
}
if(s[x][1]!=y){
if(vis[s[x][1]]){
flag=false; return;
}
num2--;
dfs(s[x][1],x,1);
}
if(s[x][2]!=y){
if(vis[s[x][2]]){
flag=false; return ;
}
num2--; dfs(s[x][2],x,1);
}
}
if(cnt[x]==1){
num[s[x][1]]++;
if(s[x][1]!=y){
if(vis[s[x][1]]){
flag=false; return ;
}
else{
dfs(s[x][1],x,1);
}
}
}
}
else{
if(cnt[x]==2){
num[s[x][1]]++; num[s[x][2]]++;
if(s[x][1]!=y&&s[x][2]!=y){
flag=false; return;
}
if(s[x][1]!=y){
if(vis[s[x][1]]){
flag=false; return;
}
num2--;
dfs(s[x][1],x,2);
}
if(s[x][2]!=y){
if(vis[s[x][2]]){
flag=false; return ;
}
num2--; dfs(s[x][2],x,2);
}
}
if(cnt[x]==1){
num[s[x][1]]++;
if(s[x][1]!=y){
if(vis[s[x][1]]){
flag=false; return ;
}
else{
dfs(s[x][1],x,2);
}
}
}
}
}
if(flag==false) return;
}
int main(){
scanf("%d%d",&n,&m);
int x,y;
for(int i=1;i<=m;i++){
int a,b; scanf("%d%d",&a,&b);
s[a][++cnt[a]]=b;
}
fac[0]=1;
for(int i=1;i<=n;i++){
fac[i]=fac[i-1]*i%mod;
}
num2=n;
for(int i=1;i<=n;i++) if(cnt[i]>2){
cout<<0<<endl; return 0;
}
for(int i=1;i<=n;i++){
if(cnt[i]!=0&&!vis[i]){
dfs(i,0,0);
if(flag==false){
cout<<0<<endl; return 0;
}
}
}
for(int i=1;i<=n;i++){
if(num[i]>2){
cout<<0<<endl;
return 0;
}
}
long long ans=fac[num2+num1];
//cout<<num2<<endl<<num1<<endl;
for(int i=1;i<=num1;i++) ans=(ans%mod*2)%mod;
cout<<ans<<endl;
return 0;
}
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
const int mod=989381;
const int maxn=500010;
int num1,num2,n,m,s[maxn][3],cnt[maxn],num[maxn],fac[maxn],flag=true,vis[maxn];
void dfs(int x,int y,int z){
if(flag==false) return;
vis[x]=true;
if(z==0){
++num1;
if(s[x][1]){
if(vis[s[x][1]]){
flag=false; return ;
}
num[s[x][1]]++; num2--; dfs(s[x][1],x,1);
}
if(s[x][2]){
if(vis[s[x][2]]){
flag=false; return ;
}
num[s[x][2]]++; --num2; dfs(s[x][2],x,2);
}
}
else{
if(z==1){
if(cnt[x]==2){
num[s[x][1]]++; num[s[x][2]]++;
if(s[x][1]!=y&&s[x][2]!=y){
flag=false; return;
}
if(s[x][1]!=y){
if(vis[s[x][1]]){
flag=false; return;
}
num2--;
dfs(s[x][1],x,1);
}
if(s[x][2]!=y){
if(vis[s[x][2]]){
flag=false; return ;
}
num2--; dfs(s[x][2],x,1);
}
}
if(cnt[x]==1){
num[s[x][1]]++;
if(s[x][1]!=y){
if(vis[s[x][1]]){
flag=false; return ;
}
else{
dfs(s[x][1],x,1);
}
}
}
}
else{
if(cnt[x]==2){
num[s[x][1]]++; num[s[x][2]]++;
if(s[x][1]!=y&&s[x][2]!=y){
flag=false; return;
}
if(s[x][1]!=y){
if(vis[s[x][1]]){
flag=false; return;
}
num2--;
dfs(s[x][1],x,2);
}
if(s[x][2]!=y){
if(vis[s[x][2]]){
flag=false; return ;
}
num2--; dfs(s[x][2],x,2);
}
}
if(cnt[x]==1){
num[s[x][1]]++;
if(s[x][1]!=y){
if(vis[s[x][1]]){
flag=false; return ;
}
else{
dfs(s[x][1],x,2);
}
}
}
}
}
if(flag==false) return;
}
int main(){
scanf("%d%d",&n,&m);
int x,y;
for(int i=1;i<=m;i++){
int a,b; scanf("%d%d",&a,&b);
s[a][++cnt[a]]=b;
}
fac[0]=1;
for(int i=1;i<=n;i++){
fac[i]=fac[i-1]*i%mod;
}
num2=n;
for(int i=1;i<=n;i++) if(cnt[i]>2){
cout<<0<<endl; return 0;
}
for(int i=1;i<=n;i++){
if(cnt[i]!=0&&!vis[i]){
dfs(i,0,0);
if(flag==false){
cout<<0<<endl; return 0;
}
}
}
for(int i=1;i<=n;i++){
if(num[i]>2){
cout<<0<<endl;
return 0;
}
}
long long ans=fac[num2+num1];
//cout<<num2<<endl<<num1<<endl;
for(int i=1;i<=num1;i++) ans=(ans%mod*2)%mod;
cout<<ans<<endl;
return 0;
}