SCC
우주 연합은 N개의 행성으로 이루어져 있습니다. 각 행성은 1번부터 N번까지 번호가 매겨져 있습니다.
우주 연합에는 행성 간을 한 방향으로만 이동할 수 있는 일방통행 워프 포탈이 M개 존재합니다.
우주 연합은 효율적인 방어를 위해 서로 워프 포탈을 통해 양방향으로 자유롭게 오갈 수 있는 행성들의 집합을 '네트워크'로 묶으려고 합니다.
즉, 어떤 네트워크 안의 임의의 두 행성 A와 B에 대해, A에서 B로도 갈 수 있고 B에서 A로도 갈 수 있어야 합니다.
(이러한 집합을 그래프 이론에서는 Strongly Connected Component, 줄여서 SCC라고 부릅니다.) https://ko.wikipedia.org/wiki/%EA%B0%95%ED%95%9C_%EC%97%B0%EA%B2%B0_%EC%9A%94%EC%86%8C
연합의 총사령관은 이러한 네트워크들 중 포함된 행성의 개수가 가장 많은 핵심 네트워크를 찾아내고, 그 네트워크에 포함된 행성들의 번호를 알아내고자 합니다.
우주 연합의 포탈 정보가 주어졌을 때, 가장 큰 네트워크에 속한 행성의 개수와 그 행성들의 번호를 오름차순으로 출력하는 프로그램을 작성하시오.
만약 가장 큰 네트워크가 여러 개라면, 포함된 행성의 번호 중 가장 작은 번호가 더 작은 네트워크를 출력합니다.
입력
첫 번째 줄에 행성의 개수 N과 워프 포탈의 개수 M이 공백으로 구분되어 주어진다.
두 번째 줄부터 M개의 줄에 걸쳐 각 워프 포탈의 출발 행성 u와 도착 행성 v가 공백으로 구분되어 주어진다.
이는 u번 행성에서 v번 행성으로 이동하는 일방통행 포탈이 존재함을 의미한다.
출력
첫 번째 줄에 가장 큰 네트워크에 속한 행성의 개수를 출력한다.
두 번째 줄에 해당 네트워크에 속한 행성의 번호들을 공백으로 구분하여 오름차순으로 출력한다.
제약 조건
- 1 <= N <= 10,000
- 1 <= M <= 100,000
- 1 <= u, v <= N
- 동일한 방향의 포탈이 중복해서 주어지지 않습니다.
예제 입력 1
5 5
1 2
2 3
3 1
3 4
4 5
예제 출력 1
3
1 2 3
예제 입력 2
4 4
1 2
2 3
3 4
4 1
예제 출력 2
4
1 2 3 4
예제 입력 3
6 6
1 2
2 3
3 4
4 5
5 6
1 6
예제 출력 3
1
1
코멘트