<aside> 💡 최단경로를 사용하기 위해 학생을 노드로 보고, 비교가 가능한 경우를 링크로 봄!
1차원리스트로 처리하는 다익스트라와 다르게 2차원리스트로 처리하는 플로이드워셜 알고리즘 사용!
</aside>
#무한
INF = int(1e9)
# 학생 수(노드 수), 비교 수(간선 수) 입력
n, m = map(int, input().split())
# 2차원 리스트 만들고 모든 값을 무한으로 초기화
graph = [[INF]* (n+1) for _ in range(n+1)]
# 자기 자신에서 자기 자신으로 가는 비용 0으로 초기화
for a in range(1, n+1):
for b in range(1, n+1):
if a == b :
graph[a][b] = 0
# 정보를 입력받아서 그 값으로 초기화
for _ in range(m):
a, b = map(int, input().split())
graph[a][b] = 1 # 비용은 1로 설정
# 점화식에 따른 플로이드 워셜 알고리즘
for k in range(1, n+1):
for a in range(1, n+1):
for b in range(1, n+1):
graph[a][b] = min(graph[a][b], graph[a][b] + graph[k][b])
result = 0
# 한 명씩 도달 가능한지(성적 비교가 가능한지) 체크
for i in range(1, n+1):
count = 0
for j in range(1, n+1):
if graph[i][j] != INF or graph[j][i] !=INF:
count+=1
if count ==n: # 모두 비교 가능하면
result +=1
print(result)