기술 개발 순서

모든 목표 기술과 선행 기술을 포함한 최소 집합을 구하고 사전식으로 가장 작은 연구 순서를 출력합니다.

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

문제

문명 시뮬레이션 게임에서 문화는 여러 기술을 개발한다. 어떤 기술은 다른 기술에 의존한다. 기술 A가 기술 B에 의존하면 B를 먼저 개발해야 A를 개발할 수 있다. 한 번에 한 기술만 개발한다.

게임에는 특정 기술을 요구하는 목표가 있다. 목표 기술을 모두 얻으려면 어떤 기술을 어떤 순서로 개발해야 하는지 정하는 프로그램을 작성한다.

입력

첫 줄에 테스트 케이스의 수 TT가 주어진다. 이어서 TT개의 테스트 케이스가 주어지며, 각 테스트 케이스의 형식은 다음과 같다.

  • 첫 줄에 의존 관계의 수 MM이 주어진다.
  • 다음 MM개의 줄에는 기술 이름 두 개가 콜론(:)으로 구분되어 주어진다. 앞의 기술이 뒤의 기술에 의존한다.
  • 다음 줄에 목표 기술의 수 QQ가 주어진다.
  • 다음 QQ개의 줄에는 목표 기술의 이름이 한 줄에 하나씩 주어진다.

기술 이름은 영문자와 숫자로 이루어진 문자열이고 대소문자를 구별한다. 같은 의존 관계나 같은 목표 기술이 여러 번 주어지기도 한다. 어떤 의존 관계에도 나타나지 않는 기술이 목표로 주어지기도 한다.

제한

  • 1T251 \le T \le 25
  • 1M1001 \le M \le 100
  • 1Q1001 \le Q \le 100
  • 의존 관계 그래프에 사이클은 없다.

출력

각 테스트 케이스마다 먼저 "Case #CC: DD" 형식으로 한 줄을 출력한다. CC는 1부터 시작하는 테스트 케이스 번호이고, DD는 개발해야 하는 기술의 최소 개수이다. 그 다음 DD개의 줄에 개발하는 순서대로 기술 이름을 한 줄에 하나씩 출력한다.

조건을 만족하는 순서가 여럿이면 사전순으로 가장 앞서는 하나만 출력한다. 두 순서는 첫 줄부터 차례로 기술 이름을 비교해서 정하고, 기술 이름은 문자의 아스키 코드 값으로 비교한다. 숫자가 대문자보다 앞서고, 대문자가 소문자보다 앞선다.