#include<bits/stdc++.h>
#define Divisior 80112002
using namespace std;
vector<vector<int> > graph(500001);
int Indegree[500001],Outdegree[500001];
vector<int> If0ut;
int NumVertex,NumEdge,FoodChain=0;
inline vector<int> TopologicalSort(){
queue<int> Searching;
vector<int> ReSuLt,Temp_Indegree(NumVertex+1);
If0ut.reserve(500001);
for (int i=1;i<=NumVertex;i++){
Temp_Indegree[i]=Indegree[i];
if(Outdegree[i]==0){If0ut.push_back(i);}
if(Indegree[i]==0){Searching.push(i);}
}
while(!Searching.empty()){
int Current=Searching.front();Searching.pop();
ReSuLt.push_back(Current);
for (int i=0;i<graph[Current].size();i++){
int Next=graph[Current][i];
Temp_Indegree[Next]--;
if(Temp_Indegree[Next]==0) Searching.push(Next);
}
}
return ReSuLt;
}
int main(){
cin>>NumVertex>>NumEdge;
for (int i=1;i<=NumEdge;i++){
int vertex,destination;
cin>>vertex>>destination;
graph[vertex].push_back(destination);
Indegree[destination]++;
Outdegree[vertex]++;
}
vector<int> TopologicalVector=TopologicalSort();
vector<int> TotDp(NumVertex+1,0);
for (int i=1;i<=NumVertex;i++){
if(Indegree[i]==0) TotDp[i]=1;
}
for (int i=0;i<TopologicalVector.size();i++){
int vert=TopologicalVector[i];
for (int j=0;j<graph[vert].size();j++){
int Desti=graph[vert][j];
TotDp[Desti]+=TotDp[vert];
}
}
for (int i=0;i<If0ut.size();i++){
if (Indegree[If0ut[i]]!=0||Outdegree[If0ut[i]]!=0){
FoodChain+=TotDp[If0ut[i]];
FoodChain%=Divisior;
}
}
cout<<FoodChain%Divisior;
return 0;
}