합리적인 순위

아직 제출이 없습니다시간 제한1초메모리 제한128 MB

문제

최근 대규모 스타크래프트 II 리그가 열렸습니다. 이 대회에는 NN명의 선수가 참가했고, 모든 선수는 서로 정확히 한 번씩 경기를 치렀습니다(라운드 로빈). 경기 결과는 N×NN \times N 크기의 표에 기록되었지만, 표만 보아서는 어떤 선수가 더 강한지 한눈에 알기 어렵습니다. 그래서 대회 주최자인 당신은 선수들의 합리적인 순위를 만들기로 했습니다.

서로 다른 두 선수 xxyy가 있고, xxyy보다 높은 순위에 있다고 합시다. 순서쌍 (x,y)(x, y)합리적이라는 것은 다음 두 조건 중 적어도 하나를 만족한다는 뜻입니다.

  1. 선수 xx가 선수 yy와의 경기에서 이겼다. 또는
  2. 순위상 xxyy 사이에 위치한 또 다른 선수 zz가 존재하여, (x,z)(x, z)(z,y)(z, y)가 모두 합리적이다.

모든 선수를 높은 순위부터 낮은 순위까지 나열한 순위가 합리적인 순위라는 것은, xxyy보다 높은 순위인 모든 쌍 (x,y)(x, y)가 합리적이라는 뜻입니다.

결과 표가 주어질 때, 선수들의 합리적인 순위를 구하세요.

입력

입력은 여러 개의 테스트 케이스로 이루어집니다. 각 테스트 케이스의 첫 줄에는 선수의 수를 나타내는 정수 NN (1N1,0001 \le N \le 1{,}000)이 주어집니다. 이어지는 NN개의 줄은 승패 표 MM을 나타냅니다. 각 줄은 문자 '0'과 '1'로만 이루어진 길이 NN의 문자열이며, 앞뒤에 공백은 없습니다. ii번째 줄의 jj번째 문자 MijM_{ij}는 선수 ii가 선수 jj를 이겼으면 1, 그렇지 않으면 0입니다. iji \ne j인 모든 경우에 대해 MijM_{ij}MjiM_{ji} 중 정확히 하나만 1입니다(무승부는 없습니다). 또한 모든 ii에 대해 Mii=0M_{ii} = 0입니다. 입력의 마지막에는 N=0N = 0인 줄이 하나 주어지며, 이 줄은 처리하지 않습니다.

출력

각 테스트 케이스에 대해, 선수들의 합리적인 순위를 가장 높은 순위의 선수부터 가장 낮은 순위의 선수까지 공백으로 구분하여 한 줄에 출력하세요. 합리적인 순위는 여러 개일 수 있으므로, 그중 사전순으로 가장 앞서는 것을 출력합니다(순위를 선수 번호의 수열로 보고 비교합니다). 만약 합리적인 순위가 존재하지 않으면, 대신 (따옴표 없이) impossible을 출력하세요.