#include<cstdio>
#include<queue>
using namespace std;
const int N=5000,M=500000,P=80112002;
int h[N],nxt[M],v[M],ind[M],otd[M],cnt[N],len,ans;//ind为入度,otd为出度
int n,m;
queue<int> q;
template<typename T>
void read(T &x){
x=0;
int f=1;
char ch=getchar();
while (ch<'0'||ch>'9'){
if (ch=='-')
f=-1;
ch=getchar();
}
while (ch>='0'&&ch<='9'){
x=x*10+ch-'0';
ch=getchar();
}
x*=f;
}
template<typename T>
void write(T x){
if (x<0){
x=-x;
putchar('-');
}
if (x>9)
write(x/10);
putchar(x%10+'0');
}
void add(int x,int y){
v[++len]=y;
nxt[len]=h[x];
h[x]=len;
++ind[y];
++otd[x];
}
int main(){
// freopen("P4017_9.in.txt","r",stdin);
int x,y;
read(n);read(m);
for (int i=1;i<=m;++i){
read(x);read(y);
add(x,y);
}
for (int i=1;i<=n;++i)
if (!ind[i]){
cnt[i]=1;
q.push(i);
}
while (!q.empty()){
int t=q.front();
q.pop();
for (int i=h[t];i;i=nxt[i]){
--ind[v[i]];
cnt[v[i]]=(cnt[v[i]]+cnt[t])%P;
if (!ind[v[i]]){
if (otd[v[i]])
q.push(v[i]);
else
ans=(ans+cnt[v[i]])%P;
}
}
}
write(ans);
// fclose(stdin);
return 0;
}
第九个点第十个点始终过不去。