카드 놓기

겹쳐 놓은 직사각형 카드의 위에서 본 결과가 주어질 때, 그 결과를 만들 수 있는 배치 순서를 찾고 사전순으로 가장 작은 순서를 출력한다.

보통7그래프위상 정렬그리디구현면접 대비아직 제출이 없습니다시간 제한2초메모리 제한512 MB

문제

영선이는 직사각형 카드를 격자 위에 한 장씩 올려놓는다. 카드마다 색이 서로 다르고, 크기도 카드마다 다를 수 있다.

카드는 항상 격자의 변과 평행하게 놓으므로, 카드 한 장은 격자의 칸으로 이루어진 직사각형을 정확히 덮는다. 카드는 겹쳐서 놓을 수 있고, 나중에 놓은 카드가 먼저 놓은 카드를 가린다. 어떤 카드도 완전히 가려지지 않으므로, 카드마다 위에서 보이는 칸이 하나 이상 있다.

카드를 모두 놓은 다음 위에서 내려다본 모습이 주어진다. 카드를 놓은 순서를 구하는 프로그램을 작성하시오.

입력

첫째 줄에 격자의 크기 NNMM이 주어진다. (1N,M501 \le N, M \le 50)

둘째 줄부터 NN개의 줄에 위에서 내려다본 모습이 한 줄에 MM개의 문자로 주어진다. 각 문자는 그 칸에서 보이는 카드의 색이며, 알파벳 소문자 'a'-'z', 대문자 'A'-'Z', 숫자 '0'-'9' 중 하나이다. '.'는 어떤 카드도 덮지 않은 빈 칸이다. 카드가 보이는 칸은 하나 이상 있다.

출력

첫째 줄에 카드를 놓은 순서대로 색을 구분 기호 없이 이어 붙여 출력한다. 가능한 순서가 여러 가지면 사전순으로 가장 앞서는 것을 출력한다. 문자의 크기는 숫자 '0'-'9', 대문자 'A'-'Z', 소문자 'a'-'z' 순으로 비교한다. 주어진 모습을 만들 수 있는 순서가 없으면 -1을 출력한다.