#include <bits/stdc++.h>
using namespace std;

#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))

typedef long long LL;

vector<list<int>> child,rchild;
vector<bool> isSearched,isRSearched;
vector<int> order,del;

int dfs(int a,int count){
  isSearched[a]=true;
  for(auto itr=child[a].begin();itr!=child[a].end();itr++){
    if(!isSearched[(*itr)]) count=dfs((*itr),count);
  }
  order[count]=a;
  return count+1;
}

void rdfs(int a,int d){
  //cout << a << " " << d << endl;
  isRSearched[a]=true;
  del[a]=d;
  for(auto itr=rchild[a].begin();itr!=rchild[a].end();itr++){
    if(!isRSearched[(*itr)]) rdfs((*itr),d);
  }
  if(a!=d){
    for(auto itr=child[a].begin();itr!=child[a].end();itr++){
      if(del[(*itr)]!=d) child[d].push_back((*itr));
    }
  }
  return;
}

LL ansdfs(int a){
  //cout << a << endl;
  LL ans=1;
  for(auto itr=child[a].begin();itr!=child[a].end();itr++){
    ans=ans*ansdfs((*itr))%1000000007;
  }
  return ans+1;
}

int main(){
  int n,m;
  cin >> n >> m;
  child=vector<list<int>>(n,list<int>());
  rchild=vector<list<int>>(n,list<int>());
  isSearched=vector<bool>(n,false);
  isRSearched=vector<bool>(n,false);
  order=vector<int>(n,-1);
  del=vector<int>(n,-1);
  vector<bool> isRoot(n,true);
  int s,d;
  for(int i=0;i<m;i++){
    cin >> s >> d;
    s--;
    d--;
    child[d].push_back(s);
    rchild[s].push_back(d);
  }
  int count=0;
  for(int i=0;i<n;i++){
    if(!isSearched[i]){
      count=dfs(i,count);
    }
  }
  // for(int i=0;i<n;i++){
  //   cout << order[i] << " ";
  // }
  // cout << endl;
  for(int i=0;i<n;i++){
    if(!isRSearched[order[n-i-1]]){
      rdfs(order[n-i-1],order[n-i-1]);
    }
  }
  for(int i=0;i<n;i++){
    if(del[i]==i){
      for(auto itr=child[i].begin();itr!=child[i].end();itr++){
        if(del[i]==del[(*itr)]){
          itr=child[i].erase(itr);
          itr--;
        }else{
          (*itr)=del[(*itr)];
          isRoot[(*itr)]=false;
        }
      }
    }
  }
  // for(int i=0;i<n;i++){
  //   cout << i << ":   ";
  //   for(auto itr=child[i].begin();itr!=child[i].end();itr++){
  //     cout << (*itr) << " ";
  //   }
  //   cout << endl;
  // }
  LL ans=1;
  for(int i=0;i<n;i++){
    if(isRoot[i]&&del[i]==i){
      ans=ans*ansdfs(i)%1000000007;
    }
  }
  cout << ans << endl;
  return 0;
}

