#include <iostream>
#include <algorithm>
#include <vector>

using namespace std;

typedef long long lli;

const lli MAX_V = 1000;
const lli M = 1000000007;

lli V, E;
vector<lli> G[MAX_V];
vector<lli> rG[MAX_V];
vector<lli> vs;
bool used[MAX_V];
lli cmp[MAX_V];

void add_edge(lli from, lli to){
  G[from].push_back(to);
  rG[to].push_back(from);
}

void dfs(lli v){
  used[v] = true;
  for(lli i=0;i<G[v].size();i++){
    if(!used[G[v][i]]) dfs(G[v][i]);
  }
  vs.push_back(v);
}

void rdfs(lli v, lli k){
  used[v] = true;
  cmp[v] = k;
  for(lli i=0;i<rG[v].size();i++){
    if(!used[rG[v][i]]) rdfs(rG[v][i], k);
  }
}

lli scc(){
  fill(used, used+V, false);
  vs.clear();
  for(lli v = 0;v<V;v++){
    if(!used[v]) dfs(v);
  }
  fill(used, used+V, false);
  lli k = 0;
  for(lli i=vs.size()-1;i>=0;i--){
    if(!used[vs[i]]) rdfs(vs[i], k++);
  }
  return k;
}

lli V2;
vector<lli> G2[MAX_V];
lli dp[MAX_V];

void make_graph(lli v){
  used[v] = true;
  for(lli i=0;i<G[v].size();i++){
    lli to = G[v][i];
    if(cmp[v] != cmp[to]) G2[cmp[v]].push_back(cmp[to]);
    if(!used[to]) make_graph(to);
  }
}

lli rec(lli v){
  used[v] = true;
  lli res = 1;
  for(lli i=0;i<G2[v].size();i++){
    lli to = G2[v][i];
    //prllif("v = %d, to = %d\n", v, to);
    if(!used[to]){
      if(dp[to] != -1) res = (res * dp[to]) % M;
      else res = (res * rec(to)) % M;
    }
  }
  res = (res + 1) % M;
  dp[v] = res;
  return res;
}

int main(){
  cin >> V >> E;
  for(lli i=0;i<E;i++){
    lli a, b;
    cin >> a >> b;
    add_edge(b-1, a-1);
  }
  V2 = scc();
  //for(lli i=0;i<V;i++) prllif("%d ", cmp[i]); puts("");
  for(lli i=0;i<V;i++) rG[i].clear();
  fill(used, used+V, false);
  for(lli i=0;i<V;i++) make_graph(i);
  /*for(lli i=0;i<V2;i++){
    prllif("i=%d:", i);
    for(lli j=0;j<G2[i].size();j++){
      prllif("%d ", G2[i][j]);
    }
    puts("");
    }*/
  fill(used, used+V, false);
  fill(dp, dp+V2, -1);
  lli ans = 1;
  for(lli i=0;i<V2;i++){
    if(!used[i]){
      //prllif("i = %d\n", i);
      ans = (ans * rec(i)) % M;
    }
  }
  //for(lli i=0;i<V2;i++) prllif("%d ", dp[i]); puts("");
  cout << ans << endl;
}