성가신 용사들

시간 제한1초메모리 제한128 MB

요약
좌우 회전 규칙과 한 번의 우회전 기회를 가진 오크의 이동 방식을 이용해 함정 없는 모든 막다른 길에 도달하는 데 필요한 최소 게이트 수를 구합니다.
난이도

어려움10점 중 8점

유형
트리, 시뮬레이션, 그래프
정답자
아직 제출이 없습니다

문제

사악한 마법사가 왕좌의 방으로 들이닥쳤다. 용사 일행이 또 동굴에 쳐들어왔다. 하필 함정을 정비하느라 모두 꺼 둔 사이에 들어와서는 동굴 안에 진까지 쳤다. 함정은 이제 다시 작동한다. 마법사는 훈련된 오크를 어디로 보낼지 지금 당장 알아내라고 명령한다. 앞서 입을 연 하인의 최후를 본 당신은 동굴 지도를 챙겨 들고 계산에 들어간다.

지도에는 11번부터 nn번까지 번호를 붙인 요충지가 nn개 있다. 통로는 모두 요충지 두 곳을 잇고, 함정은 모두 요충지에 놓여 있으며, 막다른 곳도 모두 요충지다. 한 요충지에 이어진 통로는 많아야 세 개다. 11번 요충지는 바깥으로 나가는 입구이고 통로가 정확히 하나 있다. 어느 요충지에서든 입구까지 가는 길은 하나뿐이다. 통로가 하나뿐인 요충지는 막다른 곳이며 11번 요충지만 예외다.

주인은 통로 한가운데에 마법 관문을 연다. 요충지에는 열지 못한다. 관문에서 나온 오크는 먼저 입구의 빛에서 멀어지는 쪽으로 걷는다. 그다음부터는 이렇게 움직인다.

  • 막다른 곳에서는 돌아선다.
  • 통로가 두 개인 요충지에서는 들어온 통로가 아닌 쪽으로 나간다.
  • 통로가 세 개인 요충지, 곧 갈림길에서는 왼쪽 통로를 고른다. 안으로 들어갈 때든 되돌아 나올 때든 갈림길에 설 때마다 똑같이 고른다.

왼쪽과 오른쪽은 걷고 있는 오크가 보는 방향을 기준으로 삼는다. 지도가 요충지마다 통로를 시계 방향으로 적어 둔 이유가 여기에 있다.

오크가 들어가기 전에 수 tt를 하나 알려 줄 수 있다. 그러면 갈림길에 tt번째로 섰을 때만 왼쪽 대신 오른쪽 통로로 간다. 오크는 돌아올 때까지 수를 하나만 기억하므로 한 번 들어가서 오른쪽으로 꺾는 일은 많아야 한 번이다. 같은 관문으로 오크를 여러 번 들여보낼 수 있고 그때마다 다른 수를 알려 줘도 된다. 관문은 필요한 만큼 열어 둘 수 있다.

함정이 놓인 요충지를 밟은 오크는 그대로 잃는다. 주인은 이를 용납하지 않는다. 오크는 반드시 관문으로 돌아와야 하므로 tt도 거기에 맞춰 골라야 한다.

용사 일행은 막다른 곳에 진을 쳤다. 그래서 함정을 지나지 않고 입구까지 갈 수 있는 막다른 곳은 오크가 모두 뒤져야 한다. 어떤 막다른 곳에서 입구까지 가는 길 위의 요충지 가운데 함정이 놓인 곳이 하나도 없으면 그곳은 뒤져야 한다. 그 막다른 곳 자체도 길에 포함한다. 주인이 여는 관문은 될 수 있는 대로 적어야 한다.

입력

입력은 여러 데이터 집합으로 이루어진다. 각 집합의 첫 줄에는 정수 nn과 mm이 주어진다. nn은 요충지 개수로 2≤n≤500002 \le n \le 50000이고, mm은 함정 개수로 0≤m≤5000 \le m \le 500이다.

이어지는 nn개 줄은 요충지를 설명한다. ii번째 줄에는 ii번 요충지에 이어진 통로 개수 nin_i(1≤ni≤31 \le n_i \le 3)가 먼저 오고, 그 통로가 이어지는 요충지 번호 nin_i개가 시계 방향으로 뒤따른다.

그다음 mm개 줄에는 함정이 놓인 요충지 번호가 한 줄에 하나씩 주어진다.

11번 요충지는 입구이며 통로가 항상 정확히 하나다. 마지막 데이터 집합 다음에는 00 00만 있는 줄이 오고 이 줄은 처리하지 않는다.

출력

데이터 집합마다 필요한 관문의 최소 개수를 한 줄에 하나씩 출력한다.

예제1

  1. 예제 1

    입력
    5 1
    1 2
    3 1 4 3
    1 2
    2 2 5
    1 4
    3
    4 1
    1 2
    2 1 3
    2 2 4
    1 3
    4
    0 0
    
    예상 출력
    1
    0