# Uses python3 import sys sys.setrecursionlimit(200000) def explore(v, adj, visited, postV, clock): visited[v] = True for w in adj[v]: if visited[w] == False: explore(w, adj, visited, postV, clock) postV[v] = clock[0] clock[0] = clock[0] + 1 def reverseG(adj): adjReverse = [[] for _ in range(len(adj))] for v in range(len(adj)): for w in adj[v]: adjReverse[w].append(v) return adjReverse def dfs(adj, visited, postV, clock): for v in range(len(adj)): if visited[v] == False: explore(v, adj, visited, postV, clock) def exploreWithoutPostV(v, adj, visited): visited[v] = True for w in adj[v]: if visited[w] == False: exploreWithoutPostV(w, adj, visited) def number_of_strongly_connected_components(adj): adjReversal = reverseG(adj) adjReversalVisited = [False] * len(adj) postV = [0] * len(adj) clock = [0] dfs(adjReversal, adjReversalVisited, postV, clock) temp = sorted(range(len(postV)), key=lambda k: postV[k], reverse=True) visited = [False] * len(adj) result = 0 for i in temp: if visited[i] == False: exploreWithoutPostV(i, adj, visited) result = result + 1 return result if __name__ == '__main__': input = sys.stdin.read() data = list(map(int, input.split())) n, m = data[0:2] data = data[2:] edges = list(zip(data[0:(2 * m):2], data[1:(2 * m):2])) adj = [[] for _ in range(n)] for (a, b) in edges: adj[a - 1].append(b - 1) print(number_of_strongly_connected_components(adj))