#include<iostream>
#include<queue>
#include<cstring>
using namespace std;
const int N = 5e3+10, M = 5e5+10, mod = 80112002;
int h[N], e[M], ne[M], idx;
int in[N], out[N], f[N]; //入度、出度、路径数
int n, m, ans;
void add(int a, int b)
{
e[idx] = b;
ne[idx] = h[a];
h[a] = idx ++;
}
void topsort() //拓扑排序
{
queue<int> Q;
for(int i = 1 ; i <= n ; i ++)
if(!in[i])
Q.push(i), f[i] = 1;
while(!Q.empty())
{
int t = Q.front();
Q.pop();
for(int i = h[t] ; i != -1 ; i = ne[i])
{
int j = e[i];
f[j] = f[j] + f[t] % mod;
in[j] --;
if(!in[j])
Q.push(j);
}
}
for(int i = 1 ; i <= n ; i ++)
if(!out[i]) //所有出度为0的点是终点
ans = ans + f[i] % mod;
}
int main()
{
cin >> n >> m;
memset(h, -1, sizeof h);
for(int i = 0 ; i < m ; i ++)
{
int a, b;
cin >> a >> b;
add(a, b);
in[b] ++;
out[a] ++;
}
topsort();
cout << ans % mod << endl;
return 0;
}