//拓扑序: 从入度为0开始,消除影响,一步一步
#include<bits/stdc++.h>
using namespace std;
const int mod=80112002;
unordered_map<int,vector<int>>graph;//节点的出度指向的节点
vector<int>out,in;//每一个节点的出度,入度数量
int main(){
//cin
int n,side_num;
cin>>n>>side_num;//节点的编号[1,n]
//初始化out,in的大小
out.resize(n+1);
in.resize(n+1);
for(int i=1;i<=side_num;++i){
int from,to;
cin>>from>>to;
//from-->to
graph[from].push_back(to);
in[to]++;
out[from]++;
}
//从入读in[]=0的节点开始处理
queue<int>que;
vector<int>num(n+1);//num[i]: 从1号节点到编号为i的节点的路径数
for(int i=1;i<=n;++i)
if(in[i]==0)num[i]=1,que.push(i);
//开始拓扑
while(!que.empty() ){
int cur=que.front();
que.pop();
for(auto &it:graph[cur]){
in[it]--;
num[it]=(num[it]+num[cur])%mod;
if(in[it]==0)que.push(it);
}
}
int res=0;
//最后只需要统计所有出度out[]=0的节点的路径数即可
for(int i=1;i<=n;++i){
if(out[i]==0)res=(res+num[i])%mod;
}
cout<<res<<endl;
}