27b2f55d824311446847d002275a6bb739ac9e49a0b28a3d580286b6bf1bfc65
// https://oj.uz/problem/view/BOI16_bosses
// BOI 2016 Bosses
#include <bits/stdc++.h>
using namespace std;
#define int long long
// #define GARY_DBG
#define GARY_LIB
constexpr int sizik = 5 * 1001;
#define ar std::array
#define pr std::pair
#define vec std::vector
typedef vec<vec<int>> _kra;
int n;
std::vector<int> kra[sizik];
int curr = 1;
int visited[sizik];
int parent[sizik];
std::vector<int> kra1[sizik];
// O(n + S)
void clear() {
for (int i = 1; i <= n; i++) {
parent[i] = 0;
kra1[i].clear();
}
}
// O(n+S)
void BFS(int v) {
clear();
std::queue<ar<int, 2>> q;
q.push({v, 0});
while (!q.empty()) {
const auto [u, p] = q.front();
q.pop();
assert(1 <= u && u <= n);
if (visited[u] == curr) continue;
visited[u] = curr;
parent[u] = p;
kra1[p].push_back(u);
for (const auto& y : kra[u]) {
q.push({y, u});
}
}
}
int total_cost = 0;
int DFS(int v) {
int q = 1;
for (const auto& u : kra1[v]) {
if (u != parent[v]) {
q += DFS(u);
}
}
total_cost += q;
return q;
}
int calc_cost(int root) {
int z = 0;
for (int i = 1; i <= n; i++) {
z += kra1[i].size();
}
if (z != n - 1) {
return INT64_MAX;
}
total_cost = 0;
DFS(root);
return total_cost;
}
void solve() {
std::cin >> n;
for (int i = 1; i <= n; i++) {
int a;
std::cin >> a;
for (int j = 0; j < a; j++) {
int b;
std::cin >> b;
kra[b].push_back(i);
}
}
int ans = INT64_MAX;
for (int i = 1; i <= n; i++) {
curr++;
BFS(i);
int local_cost = calc_cost(i);
ans = std::min(ans, local_cost);
}
std::cout << ans << std::endl;
}
int32_t main() {
std::ios_base::sync_with_stdio(0);
std::cin.tie(0);
std::cout.tie(0);
int t = 1;
// std::cin >> t;
for (; t > 0; t--) {
solve();
}
return 0;
}