#include <bits/stdc++.h>
using namespace std;
vector<vector<int> > gm;
vector<vector<int> > g;
int p = 0;
bool used[100];
void dfs(int v) {
  used[v] = true;
  for (int i = 0; i < gm[v].size(); i++) {
    int to = gm[v][i];
    for (int j = 0; j < g[to].size(); j++) {
      if (!used[g[to][j]]) dfs(g[to][j]);
    }
  }
}
int main() {
  int n, a, m, l, k = 0;
  cin >> n >> m;
  g.resize(m);
  gm.resize(n);
  for (int i = 0; i < n; i++) {
    cin >> a;
    if (!a) k++;
    for (int j = 0; j < a; j++) {
      cin >> l;
      gm[i].push_back(l - 1);
      g[l - 1].push_back(i);
    }
  }
  for (int i = 0; i < n; i++) {
    if (!used[i]) {
      p++;
      dfs(i);
    }
  }
  if (k == n)
    cout << k << endl;
  else
    cout << p - 1 << endl;
  return 0;
}
