def main():
	N, M = tuple(map(int, input().split()))
	edges = dict([(key, list()) for key in range(1, N+1)])
	for _ in range(M):
		s, d = tuple(map(int, input().split()))
		edges[s].append(d)
	source = get_source(edges)
	
	topsort = list()
	DFS(edges, set(), topsort, source)

	r_edges = reverse_edges(edges)
	near_source = list()
	visited = set()
	came_from = dict([(key, list()) for key in range(1, N+1)])
	count = 0
	for v in topsort:
		for d in r_edges[v]:
			if d == source:
				near_source.append(v)
			elif d not in visited:
				count += 1
				visited.add(d)
				came_from[v].append(d)
	for v in near_source:
		if not came_from[v]:
			count += 1
		
	print(M - count)			
	

def DFS(edges, visited, topsort, vertex):
	if vertex in visited:
		return
	visited.add(vertex)
	for v in edges[vertex]:
		DFS(edges, visited, topsort, v)
	topsort.append(vertex)
		
def get_source(edges):
	p_sources = set(list(edges.keys()))
	for s in edges:
		for d in edges[s]:
			if d not in p_sources:
				continue
			p_sources.remove(d)
	return tuple(p_sources)[0]

def reverse_edges(edges):
	new_edges = dict([(key, list()) for key in edges])
	for s in edges:
		for d in edges[s]:
			new_edges[d].append(s)
	return new_edges


if __name__ == '__main__':
	main()

