대입문 평가

각 값이 인자 변수에 의존하는 대입문들이 있을 때 모든 의존성을 해결하는 평가 순서가 존재하는지 판정한다.

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

문제

순서가 정해지지 않은 대입문 목록이 주어진다. 모든 대입문을 평가할 수 있는 순서가 존재하는지 판정하는 프로그램을 작성한다.

대입문은 대입 변수, 대입 연산자, 식이 이 순서대로 이어진 형태다. 대입문은 직접 정한 순서대로 하나씩 평가한다. 변수는 앞선 대입문의 대입 변수로 이미 나온 경우에만 평가할 수 있다.

모든 식은 함수 호출 하나다. 함수는 인자를 0개 이상 몇 개든 받는다. 인자가 없는 호출은 항상 유효하고, 인자가 있는 호출은 인자로 쓰인 변수를 모두 평가할 수 있을 때 유효하다.

다음 대입문 목록을 보자.

a=f(b,c)
b=g()
c=h()

아래 순서라면 모든 대입문이 유효하다.

b=g()
c=h()
a=f(b,c)

g()h()는 어떤 변수에도 의존하지 않으므로 bc를 먼저 평가하고, f(b,c)가 의존하는 bc가 그때는 이미 평가되었으므로 a가 뒤따른다.

반면 아래 순서는 유효하지 않다.

b=g()
a=f(b,c)
c=h()

f(b,c)가 인자로 c를 받는데 c는 아직 대입 변수로 나온 적이 없기 때문이다.

또 다른 예는 a=f(a)다. 식 f(a)가 같은 대입문이 대입하는 변수 a에 의존하므로 어떤 순서로도 평가할 수 없다.

입력

첫째 줄에 테스트 케이스의 수 TT가 주어진다. 이어서 TT개의 테스트 케이스가 주어진다. 각 테스트 케이스의 첫째 줄에는 대입문의 개수 NN이 주어지고, 다음 NN개 줄에 대입문이 한 줄에 하나씩 주어진다.

각 대입문은 대입 변수, 대입 연산자, 식이 공백 없이 이어진다. 대입 연산자는 항상 =다. 식은 함수 이름, (, 쉼표로 구분한 변수 이름 0개 이상, )가 차례로 이어진 형태다. 변수 이름과 함수 이름은 소문자 영어 알파벳으로만 이루어진다. 함수와 이름이 같은 변수는 없다. 같은 변수가 대입 변수로 두 번 이상 나오지 않는다. 반면 인자로는 같은 변수가 여러 번 나올 수 있고 한 호출 안에서 여러 번 나올 수도 있으며, 같은 함수 이름이 여러 대입문에 나올 수도 있다.

제한

  • 1T201 \le T \le 20
  • 1N10001 \le N \le 1000
  • 함수 호출의 인자 개수는 0개 이상 10개 이하다.
  • 변수 이름의 길이는 1자 이상 20자 이하다.

출력

각 테스트 케이스마다 Case #x: y 형식으로 한 줄씩 출력한다. x는 1부터 시작하는 테스트 케이스 번호이고, y는 모든 대입문을 평가하는 순서가 있으면 GOOD, 없으면 BAD다.