우주선 방어 (Small)

같은 색 방 사이는 무료로 순간이동하고 일방향 터보리프트로 이동하며 각 병사의 최단 이동 시간을 구합니다.

보통5최단 경로그래프아직 제출이 없습니다시간 제한5초메모리 제한512 MB

문제

적이 우주선에 침입했다. 뛰어난 전술만이 우주선을 지켜낼 수 있다. 병사가 우주선 안을 돌아다닐 때 쓰는 장치는 두 가지다. 순간이동기와 터보리프트다.

순간이동기는 병사를 즉시 다른 방으로 옮긴다. 모든 방에는 순간이동기가 하나씩 있고, 방마다 색이 하나씩 정해져 있다. 어떤 방에 있는 병사는 그 방의 순간이동기로 같은 색인 다른 방 어디로든 즉시 이동할 수 있다. 이때 걸리는 시간은 0초다.

터보리프트는 방과 방 사이를 더 느리게 오간다. 여러 방향으로 움직이는 승강기라고 보면 된다. 터보리프트 하나는 정해진 한 방에서 정해진 다른 한 방으로 병사를 옮기고, 옮기는 데 걸리는 시간이 정해져 있다. 터보리프트에는 다음 두 가지 성질이 있다.

  • 터보리프트는 한 방향으로만 움직인다. 방 aa에서 방 bb로 병사를 옮기는 터보리프트가 있어도, 같은 터보리프트로 방 bb에서 방 aa로 갈 수는 없다. 그 방향으로 움직이는 터보리프트가 따로 있을 수는 있다.
  • 여러 병사가 같은 터보리프트를 함께 쓸 수 있고, 서로 방해하지 않는다.

병사 여러 명의 현재 위치와 목적지가 주어진다. 각 병사가 현재 위치에서 목적지까지 가는 데 걸리는 최소 시간을 구하라.

입력

첫 줄에 테스트 케이스의 수 TT가 주어진다. 이어서 TT개의 테스트 케이스가 주어진다.

각 테스트 케이스의 첫 줄에는 우주선의 방 개수 NN이 주어진다. 방 번호는 1번부터 NN번까지다. 이어지는 NN개의 줄에는 1번 방부터 NN번 방까지의 색이 한 줄에 하나씩 문자열로 주어진다. 각 문자열은 알파벳 소문자 a부터 z까지와 숫자 0부터 9까지로만 이루어지고, 길이는 2 이하다.

다음 줄에는 터보리프트의 개수 MM이 주어진다. 이어지는 MM개의 줄에는 세 정수 aia_i, bib_i, tit_i가 공백으로 구분되어 주어진다. 방 aia_i에서 방 bib_i로 병사를 tit_i초 만에 옮기는 터보리프트가 있다는 뜻이다.

다음 줄에는 지휘하는 병사의 수 SS가 주어진다. 이어지는 SS개의 줄에는 병사 한 명의 현재 위치 pjp_j와 목적지 qjq_j가 공백으로 구분되어 주어진다.

제한은 다음과 같다.

  • 1T101 \le T \le 10
  • 1N10001 \le N \le 1000
  • 0M30000 \le M \le 3000
  • 1ai,biN1 \le a_i, b_i \le N
  • 0ti10000 \le t_i \le 1000
  • 1S1001 \le S \le 100
  • 1pj,qjN1 \le p_j, q_j \le N

출력

각 테스트 케이스마다 먼저 Case #x: 형태의 줄을 하나 출력한다. 여기서 x는 테스트 케이스 번호이고 1부터 시작한다. 그 다음 SS개의 줄에 정수를 하나씩 출력한다. jj번째 줄에는 병사가 방 pjp_j에서 방 qjq_j까지 가는 데 걸리는 최소 시간을 초 단위로 출력한다. 방 pjp_j에서 방 qjq_j로 가는 경로가 없으면 -1을 출력한다.