#include<stdio.h>
#include<algorithm>
#include<vector>
using namespace std;
vector<int>g[1100];
vector<int>rev[1100];
int num;
int v[1100];
int tmp[1100];
int g2[1100][1100];
void dfs(int a){
	v[a]=1;
	for(int i=0;i<g[a].size();i++)if(!~v[g[a][i]])dfs(g[a][i]);
	tmp[num++]=a;
}
void dfs2(int a){
	v[a]=num;
	for(int i=0;i<rev[a].size();i++)if(!~v[rev[a][i]])dfs2(rev[a][i]);
}
long long mod=1000000007;
long long dp[1100][2];
int main(){
	int a,b;scanf("%d%d",&a,&b);
	for(int i=0;i<b;i++){
		int p,q;scanf("%d%d",&p,&q);
		p--;q--;
		g[p].push_back(q);
		rev[q].push_back(p);
	}
	for(int i=0;i<a;i++)v[i]=-1;
	for(int i=0;i<a;i++){
		if(!~v[i]){
			dfs(i);
		}
	}
	num=0;
	for(int i=0;i<a;i++)v[i]=-1;
	for(int i=a-1;i>=0;i--){
		if(!~v[tmp[i]]){
			dfs2(tmp[i]);
			num++;
		}
	}
	//for(int i=0;i<a;i++)printf("%d\n",v[i]);
	int n=num;
	for(int i=0;i<a;i++)for(int j=0;j<g[i].size();j++)if(v[i]!=v[g[i][j]])g2[v[i]][v[g[i][j]]]=1;
	//for(int i=0;i<n;i++)for(int j=0;j<n;j++)if(g2[i][j])printf("%d %d\n",i,j);
	for(int i=0;i<n;i++){
		long long t1=1;
		long long t2=1;
		for(int j=0;j<n;j++)if(g2[j][i]){
			t1=t1*(dp[j][0]+dp[j][1])%mod;
			t2=t2*dp[j][1]%mod;
		}
		//t1=t1*2%mod;
		//t1=(t1+t2)%mod;
		dp[i][0]=t1;
		dp[i][1]=t2;
	//	printf("%d: %lld %lld\n",i,t1,t2);
	}
	long long ret=1;
	for(int i=0;i<n;i++){
		bool ok=true;
		for(int j=0;j<n;j++)if(g2[i][j])ok=false;
		if(ok)ret=ret*(dp[i][0]+dp[i][1])%mod;
	}
	printf("%lld\n",ret);
}