카렐은 로봇 대회에 자신의 로봇을 등록하려고 한다. 등록하려면 로봇의 안전 인증서를 받고 여러 서류를 작성해야 한다. 그래서 대회 주최 측 건물 입구에서 출발해 정해진 순서대로 사무실을 모두 한 번씩 들른 다음 다시 입구로 돌아와야 한다. 다행히 건물 복도는 사이클을 이루지 않아서, 두 사무실 사이의 경로는 언제나 하나뿐이다.
대회를 열려면 문제 지문과 정답 코드만으로는 부족하다. 제출된 코드를 검증할 테스트 데이터도 만들어야 한다. 특히 비효율적인 풀이를 걸러내려면 걷는 거리가 가장 긴 방문 순서가 필요하다. 그 순서를 찾아라.
건물은 정점이 N개인 트리이고, 각 정점에 사무실이 하나씩 있다. 트리는 간선으로 이어진 정점의 모임이다. 간선 하나는 정점 두 개를 잇고, 임의의 두 정점 vi와 vj 사이에는 경로가 정확히 하나 있다. 경로의 길이는 vi에서 vj로 갈 때 지나는 간선의 수이고, 이를 dist(vi,vj)로 쓴다.
입력은 여러 테스트 케이스로 이루어진다. 각 테스트 케이스의 첫 줄에는 트리의 정점 수 N (2≤N≤10000)이 주어진다. 정점 번호는 0부터 N−1까지다. 이어지는 N−1개 줄 가운데 i번째 줄에는 정수 fi (0≤fi<i)가 주어진다. 이는 정점 i와 정점 fi를 잇는 간선이 트리에 있다는 뜻이다.
각 테스트 케이스 뒤에는 빈 줄이 하나 온다. 입력은 파일이 끝나면 함께 끝난다. 테스트 케이스는 100개 이하이고, 모든 테스트 케이스의 N을 더한 값은 50000 이하다.
각 테스트 케이스마다 한 줄에 정수 N개 v1,…,vN을 공백으로 구분해 출력한다. 0,1,…,N−1이 각각 정확히 한 번씩 나와야 하고, 합
∑i=1N−1dist(vi,vi+1)+dist(vN,v1)
이 가능한 최댓값이어야 한다.
합을 최대로 만드는 순열은 보통 여러 개다. 그중 사전순으로 가장 앞서는 순열 하나만 출력한다. 두 순열을 앞에서부터 비교해 값이 처음으로 달라지는 자리에서 더 작은 수가 놓인 쪽이 사전순으로 앞선다.