import java.util.HashSet;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;

public class Main {
    // 邻接节点
    private static HashSet<Integer>[] adj;
    // 入度
    private static int[] T;
    // 出度
    private static int[] S;

    public static void main(String[] args){
        Scanner in = new Scanner(System.in);

        while(in.hasNext()){
            solution(in);
        }
    }

    /**
     * 模拟法: bfs
     * @param in
     */
    private static void solution(Scanner in){
        int V = in.nextInt();
        int E = in.nextInt();

        adj = new HashSet[V+1];
        for(int i=1; i<=V; i++){
            adj[i] = new HashSet<>();
        }
        T = new int[V+1];
        S = new int[V+1];

        int u,v;
        for(int i=1; i<=E; i++){
            u = in.nextInt();
            v = in.nextInt();
            // 去环
            if(u != v){
                adj[u].add(v);
            }
        }

        for(int i=1; i<=V; i++){
            bfs(i);
        }

        int count = 0;
        for(int i=1; i<=V; i++){
            if(T[i] > S[i]){
                count++;
            }
        }

        System.out.println(count);
    }

    /**
     * 广度优先搜索
     * @param start
     * @return
     */
    private static void bfs(int start){
        HashSet<Integer> visited = new HashSet<>();
        Queue<Integer> queue = new LinkedList<>();

        visited.add(start);
        queue.offer(start);

        int size;
        while(!queue.isEmpty()){
            Integer u;
            size = queue.size();
            S[start] += size;
            for(int i=1; i<=size; i++){
                u = queue.poll();
                T[u]++;
                for(Integer v: adj[u]){
                    if(!visited.contains(v)){
                        visited.add(v);
                        queue.offer(v);
                    }
                }
            }
        }
    }
}