합리적인 순위
시간 제한1초메모리 제한128 MB
완전 토너먼트의 승패 표가 주어질 때, 위에 있는 선수와 아래에 있는 선수 사이에 중간 선수들을 거치는 승리 사슬이 존재하도록 하는 사전순 최소 순위를 구한다.
문제
최근 대규모 스타크래프트 II 리그가 열렸습니다. 이 대회에는 명의 선수가 참가했고, 모든 선수는 서로 정확히 한 번씩 경기를 치렀습니다(라운드 로빈). 경기 결과는 크기의 표에 기록되었지만, 표만 보아서는 어떤 선수가 더 강한지 한눈에 알기 어렵습니다. 그래서 대회 주최자인 당신은 선수들의 합리적인 순위를 만들기로 했습니다.
서로 다른 두 선수 와 가 있고, 가 보다 높은 순위에 있다고 합시다. 순서쌍 가 합리적이라는 것은 다음 두 조건 중 적어도 하나를 만족한다는 뜻입니다.
- 선수 가 선수 와의 경기에서 이겼다. 또는
- 순위상 와 사이에 위치한 또 다른 선수 가 존재하여, 와 가 모두 합리적이다.
모든 선수를 높은 순위부터 낮은 순위까지 나열한 순위가 합리적인 순위라는 것은, 가 보다 높은 순위인 모든 쌍 가 합리적이라는 뜻입니다.
결과 표가 주어질 때, 선수들의 합리적인 순위를 구하세요.
입력
입력은 여러 개의 테스트 케이스로 이루어집니다. 각 테스트 케이스의 첫 줄에는 선수의 수를 나타내는 정수 ()이 주어집니다. 이어지는 개의 줄은 승패 표 을 나타냅니다. 각 줄은 문자 '0'과 '1'로만 이루어진 길이 의 문자열이며, 앞뒤에 공백은 없습니다. 번째 줄의 번째 문자 는 선수 가 선수 를 이겼으면 1, 그렇지 않으면 0입니다. 인 모든 경우에 대해 와 중 정확히 하나만 1입니다(무승부는 없습니다). 또한 모든 에 대해 입니다. 입력의 마지막에는 인 줄이 하나 주어지며, 이 줄은 처리하지 않습니다.
출력
각 테스트 케이스에 대해, 선수들의 합리적인 순위를 가장 높은 순위의 선수부터 가장 낮은 순위의 선수까지 공백으로 구분하여 한 줄에 출력하세요. 합리적인 순위는 여러 개일 수 있으므로, 그중 사전순으로 가장 앞서는 것을 출력합니다(순위를 선수 번호의 수열로 보고 비교합니다). 만약 합리적인 순위가 존재하지 않으면, 대신 (따옴표 없이) impossible을 출력하세요.