시간제한 : 2초, 난이도 : 골드 4, 백준 : 1043번

예제 입력1
4 3 //사람 수, 파티 수
0 //진실을 아는 사람 정보
2 1 2 //파티 정보
1 3
3 2 3 4

출력
3
예제 입력6
8 5
3 1 2 7
2 3 4
1 5
2 5 6
2 6 8
1 8

출력
5
import java.util.ArrayList;
import java.util.Scanner;

public class Practice52 {
	public static int[] parent; //대표 노드 저장 배열
	public static int[] trueP; //진실을 아는 사람 데이터
	public static ArrayList<Integer>[] party; //파티 데이터
	public static int result;

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int N = sc.nextInt(); //사람 수
		int M = sc.nextInt(); //파티 수
		int T = sc.nextInt(); //진실을 아는 사람 정보
		
		result = 0;
		trueP = new int[T];
		for(int i = 0; i < T; i++) {
			trueP[i] = sc.nextInt();
		}
		
		party = new ArrayList[M];
		for(int i = 0; i < M; i++) {
			party[i] = new ArrayList<Integer>();
			int party_size = sc.nextInt();
			for(int j = 0; j < party_size; j++) {
				party[i].add(sc.nextInt());
			}
			
		}
		
		parent = new int[N + 1];
		for(int i = 0; i <= N; i++) {
			parent[i] = i;
		}
		for(int i = 0; i < M; i++) {
			int firstPeople = party[i].get(0);
			for(int j = 1; j < party[i].size(); j++) {
				union(firstPeople, party[i].get(j));
			}
		}
		
		for(int i = 0; i < M; i++) {
			boolean isPossible = true;
			int cur = party[i].get(0);
			for(int j = 0; j < trueP.length; j++) {
				if(find(cur) == find(trueP[j])) {
					isPossible = false;
					break;
				}
			}
			if(isPossible) result++;
		}
		System.out.println(result);
		
		
		sc.close();
	}
	
	public static void union(int a, int b) {
		a = find(a);
		b = find(b);
		if(a != b) {
			parent[b] = a;
		}
	}
	
	public static int find(int a) {
		if(a == parent[a])
			return a;
		else
			return parent[a] = find(parent[a]);
	}
}