#include "bits/stdc++.h"
using namespace std;
#define int long long
int mod=1e9+7;

//scc
const int MAX_V=1e5+1;
int V;
vector<int> G[MAX_V];
vector<int> rG[MAX_V];
vector<int> vs;
bool used[MAX_V];
int cmp[MAX_V];

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

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

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

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

signed main(){
  int n;
  cin>>V>>n;
  vector<int> s(n),d(n);
  for(int i=0;i<n;i++){
    cin>>s[i]>>d[i];
    s[i]--;
    d[i]--;
    add_edge(s[i],d[i]);
  }

  int sz=scc();

  vector<vector<int> > dag(sz),rdag(sz);
  for(int i=0;i<n;i++){
    if(cmp[s[i]]!=cmp[d[i]]){
      dag[cmp[s[i]]].push_back(cmp[d[i]]);
      rdag[cmp[d[i]]].push_back(cmp[s[i]]);
    }
  }

  int ans=1;
  vector<vector<int> > dp(sz,vector<int>(2,1));
  for(int i=0;i<sz;i++){
    for(int j=0;j<rdag[i].size();j++){
      (dp[i][0]*=dp[rdag[i][j]][0])%=mod;
      (dp[i][1]*=dp[rdag[i][j]][0]+dp[rdag[i][j]][1])%=mod;
    }
    if(dag[i].size()==0)(ans*=dp[i][0]+dp[i][1])%=mod;
  }
  cout<<ans%mod<<endl;
}

