#include<bits/stdc++.h>
using namespace std;
int mod = 80112002;
bool notPlant[5050]; // 如为true则说明不是生产者,反之为生产者
long long numOfChain[5050]; // 记忆化搜索,防止多次计算从同一个点出发的食物链数
typedef struct point{
int count; // 被多少种生物吃
vector<int> beAte; // 记录捕食者的编号,数量不确定因此用vector
}P;
P p[5050] = {0}; // 存储n种生物
int n, m, ans;
long long dfs(int num)
{
if(!p[num].count) // 如果走到尽头,则遍历完一条食物链
return numOfChain[num] = 1;
int sum = 0;
if(!numOfChain[num])
// 如果没有计算过从这个点出发的食物链数,则计算,否则直接输出
{
for(int i=0;i<p[num].count;++i)
{
sum = (sum + dfs(p[num].beAte[i])) % mod;
}
numOfChain[num] = sum % mod;
}
return numOfChain[num];
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0), cout.tie(0);
cin>>n>>m;
int a, b;
for(int i=0;i<m;++i)
{
cin>>a>>b;
notPlant[b] = true;
++p[a].count;
p[a].beAte.push_back(b);
}
for(int i=1;i<=n;++i)
{
// 从每个生产者开始计算其食物链数,和即为总食物链数
if(!notPlant[i] && p[a].count)
{
ans = (ans + dfs(i)) % mod;
}
}
cout<<ans % mod;
return 0;
}