#include<bits/stdc++.h>
using namespace std;
#define rep0(i,n) for(int i=0;i<n;i++)
#define rep1(i,n) for(int i=1;i<=n;i++)
#define REP(i,j,n) for(int i=j;i<=n;i++)
#define REPG(i,h,x) for(int i=h[x];~i;i=edge[i].next)
typedef unsigned long long ull;
const int M=5e5+5;
const int N=5e3+5;
int head[N],cnt,f[N],rudu[N],chudu[N];
struct qwq{
int v,next;
}edge[M];
inline void add(int x,int y){
edge[++cnt]=(qwq){y,head[x]},head[x]=cnt;
}
queue<int> q;
int n,m,ans;
const int MOD=80112002;
int main(){
cin>>n>>m;
memset(head,-1,sizeof(head));
rep1(i,m){
int x,y;
cin>>x>>y;
add(x,y);
rudu[y]++;
chudu[x]++;
}
rep1(i,n){
if(rudu[i]==0)
f[i]=1;
q.push(i);
}
while(!q.empty()){
int u=q.front();
q.pop();
REPG(i,head,u){
int v=edge[i].v;
f[v]+=f[u];
f[v]%=MOD;
rudu[v]--;
if(rudu[v]==0){
if(chudu[v]==0){
ans+=f[v];
ans%=MOD;
continue;
}
q.push(v);
}
}
}
cout<<ans<<endl;
return 0;
}