// [백준] 1043. 거짓말 (Kotlin)import java.io.BufferedReader
import java.io.InputStreamReader
import java.util.*
lateinitvar parent: Array<Int>
funmain() = with(BufferedReader(InputStreamReader(System.`in`))){
val (n,m) = readLine().split(" ").map { it.toInt() } // 사람의 수, 파티의 수val arr = Array(n + 1) {false} // 진실 아는 사람var st = StringTokenizer(readLine())
val party = Array (m) { arrayListOf<Int>() } // 파티 참여 인원 정보
parent = Array(n + 1) {it} // 부모 정보val trueN = st.nextToken().toInt() // 진실을 아는 사람 수// 진실을 아는 사람
repeat(trueN){
val tmp = st.nextToken().toInt()
arr[tmp] = true
}
// 파티 정보for(i in0 until m){
st = StringTokenizer(readLine())
val pn = st.nextToken().toInt() // 파티 인원수for(j in0 until pn){
party[i].add(st.nextToken().toInt())
// 파티 참여 인원들의 부모노드를 같게함if (j > 0) union(party[i][j], party[i][j - 1])
}
}
for(i in1 .. n){
if(arr[i]){
// 진실을 아는 사람 부모 정보val par = find(i)
// 전체 탐색, 부모가 같다면 진실을 아는 사람에 추가for(j in1 .. n){
if(par == find(j)){
arr[j] = true
}
}
}
}
val trueList = arrayListOf<Int>()
for(i in arr.indices){
if(arr[i]){
trueList.add(i)
}
}
var result = m
for(i in0 until m){
// 파티 인원 중 진실을 아는 사람이 있다면 진실을 아는 파티for(j in party[i]){
if(trueList.contains(j)){
result--
break
}
}
}
println(result)
}
fununion(x: Int, y: Int){
val nx = find(x)
val ny = find(y)
if(nx != ny){
parent[ny] = nx
}
}
// 최상위 노드 찾기funfind(x: Int): Int{
returnif (x == parent[x]) x
else {
parent[x] = find(parent[x])
parent[x]
}
}