package bytedance;
import java.util.Scanner;
public class Five {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int m = scanner.nextInt();
int [] r = new int[2*m];
for (int i = 0; i < 2*m; i++) {
r[i] = scanner.nextInt();
}
int INF = Integer.MAX_VALUE;
int [] nodes = new int[n+1];
for (int i = 1; i < nodes.length; i++) {
nodes[i] = i;
}
int [][] c = new int[n+1][n+1];
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
if (j != i){
c[i][j] = INF;
}
}
}
for (int i = 0; i < m; i++) {
int a = r[2*i];
int b = r[2*i+1];
c[a][b] = 1;
}
Floyd floyd = new Floyd(nodes,c);
int ans = floyd.floyd();
System.out.println(ans);
}
}
class Floyd {
int[][] Matrix;
int[] Nodes;
private final int INF = Integer.MAX_VALUE;
public Floyd(int [] Nodes, int[][] Matrix){
this.Nodes = Nodes;
this.Matrix = Matrix;
}
public int floyd(){
int[][] distance = new int[Nodes.length][Nodes.length];
for(int i=1; i<Nodes.length; i++){
for(int j=1; j<Nodes.length; j++){
distance[i][j] = Matrix[i][j];
}
}
for(int k=1; k<Nodes.length; k++){
for(int i=1; i<Nodes.length; i++){
for(int j=1; j<Nodes.length; j++){
int temp = (distance[i][k] == INF || distance[k][j] == INF) ? INF : distance[i][k] + distance[k][j];
if(distance[i][j] > temp){
distance[i][j] = temp;
}
}
}
}
int ans = 0;
for (int i = 1; i < Nodes.length; i++) {
boolean flag = true;
for (int j = 1; j < Nodes.length; j++){
if (distance[j][i] == Integer.MAX_VALUE){
flag = false;
break;
}
}
if (flag){
ans++;
}
}
return ans;
}
}