#include <bits/stdc++.h>
using namespace std;
long long max(long long a, long long b) {
  if (a > b)
    return a;
  else
    return b;
}
long long min(long long a, long long b) {
  if (a < b)
    return a;
  else
    return b;
}
long long power(long long B, long long P) {
  if (P == 0) return 1;
  long long X = power(B, P / 2);
  if (P % 2 == 0)
    return X * X;
  else
    return B * X * X;
}
long long fx[] = {1, -1, 0, 0};
long long fy[] = {0, 0, 1, -1};
char CH[1000][1000], ch;
vector<long long> V;
vector<long long> G[10000];
long long parent[20000];
long long ans = 0;
long long T, N, E, u, v, i, j, k, sum = 0, ck = 0, x, y;
long long Find(long long r) {
  if (parent[r] == r) return r;
  parent[r] = Find(parent[r]);
  return parent[r];
}
void Union(long long x, long long y) {
  long long u = Find(x);
  long long v = Find(y);
  if (u != v) {
    parent[u] = v;
    G[u].push_back(v);
    G[v].push_back(u);
    if (ans == 0)
      ans += 2;
    else
      ans++;
  }
}
int main() {
  string S, S1;
  set<long long> st;
  double d1, d2, d3;
  cin >> N >> E;
  for (i = 1; i <= N; i++) {
    parent[i + 100] = i + 100;
  }
  for (i = 1; i <= E; i++) parent[i] = i;
  for (i = 1; i <= N; i++) {
    cin >> u;
    for (j = 1; j <= u; j++) {
      cin >> v;
      st.insert(v);
      Union(i + 100, v);
    }
  }
  cout << N + st.size() - ans;
  return 0;
}
