#include <bits/stdc++.h>
using namespace std;
int n, m;
set<int> a[101];
vector<int> g[101];
bool was[101];
void dfs(int v) {
  was[v] = true;
  for (int i = 0; i < g[v].size(); i++) {
    if (!was[g[v][i]]) dfs(g[v][i]);
  }
}
bool ok(int i, int j) {
  for (set<int>::iterator it = a[i].begin(); it != a[i].end(); it++)
    if (a[j].count(*it)) return true;
  return false;
}
int main() {
  int nol = 0;
  cin >> n >> m;
  for (int i = 0; i < n; i++) {
    int k = 0;
    cin >> k;
    for (int j = 0; j < k; j++) {
      int x;
      cin >> x;
      a[i].insert(x);
      nol++;
    }
  }
  for (int i = 0; i < n; i++)
    for (int j = i + 1; j < n; j++)
      if (ok(i, j)) {
        g[i].push_back(j), g[j].push_back(i);
      }
  int res = 0;
  for (int i = 0; i < n; i++) {
    if (!was[i]) dfs(i), res++;
  }
  if (!nol) {
    res++;
  }
  cout << res - 1;
  return 0;
}
