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

using namespace std;

const int MOD=1000000007;
int V;
vector<int> G[1000],rG[1000];
vector<int> vs;
bool used[1000];
int cmp[1000];

set<int> D[1000];

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++){
    int n=rG[v][i];
    if(used[n]){
      if(cmp[n]!=k){
	D[k].insert(cmp[n]);
      }
    }else{
      rdfs(n,k);
    }
  }
}

long long sdfs(int v){
  used[v]=true;
  long long r=1;
  for(auto e:D[v]){
    r=(r*sdfs(e))%MOD;
  }
  return (r+1)%MOD;
}

int main(){
  int N,M;
  cin>>N>>M;
  V=N;
  while(M--){
    int s,d;
    cin>>s>>d;
    add_edge(s-1,d-1);
  }
  fill(begin(used),end(used),false);
  for(int v=0;v<V;v++){
    if(!used[v]){
      dfs(v);
    }
  }
  fill(begin(used),end(used),false);
  int k=0;
  for(int i=vs.size()-1;i>=0;i--){
    if(!used[vs[i]]){
      rdfs(vs[i],k++);
    }
  }
  fill(begin(used),end(used),false);
  long long a=1;
  for(int i=k-1;i>=0;i--){
    if(!used[i]){
      a=(a*sdfs(i))%MOD;
    }
  }
  cout<<a<<endl;
}