```go
package main
import (
"fmt"
)
var parent []int
func find(i int) int {
if parent[i] == i {
return i
}
parent[i] = find(parent[i])
return parent[i]
}
func union(i, j int) {
rootI := find(i)
rootJ := find(j)
if rootI != rootJ {
parent[rootI] = rootJ
}
}
func main() {
var n, m int
if _, err := fmt.Scan(&n, &m); err != nil {
return
}
parent = make([]int, n)
for i := 0; i < n; i++ {
parent[i] = i
}
lang := make([]int, m+1)
for i := 1; i <= m; i++ {
lang[i] = -1
}
anyLang := false
for i := 0; i < n; i++ {
var k int
fmt.Scan(&k)
if k > 0 {
anyLang = true
}
for j := 0; j < k; j++ {
var l int
fmt.Scan(&l)
if lang[l] != -1 {
union(i, lang[l])
}
lang[l] = i
}
}
roots := 0
for i := 0; i < n; i++ {
if parent[i] == i {
roots++
}
}
if !anyLang {
fmt.Println(n)
} else {
fmt.Println(roots - 1)
}
}
```