#include using namespace std; int solve(int N, int K); int main(){ std::ios::sync_with_stdio(false); int N, K; while(cin >> N){ int K; cin >> K; int ans = solve(N, K); cout << ans << endl; } } void compute_add(vector& ntypes, int& ndiff_types, vector& vals, int& nall) { for (auto a : vals) { ntypes[a]++; if (ntypes[a] == 1) ndiff_types++; } nall += vals.size(); } void compute_remove(vector& ntypes, int& ndiff_types, vector& vals, int& nall) { for (auto a : vals) { ntypes[a]--; if (ntypes[a] == 0) ndiff_types--; } nall -= vals.size(); } int solve(int N, int K) { vector> stands; stands.reserve(N); for (int i = 0; i < N; ++i) { int L; cin >> L; vector stand(L, 0); for (int j = 0; j < L; ++j) { int t; cin >> t; stand[j] = t-1; } stands.push_back(stand); } int ndiff_types{0}; int nall{0}; vector ntypes(K, 0); int best = numeric_limits::max(); // N >= 2 for (int left = 0, right = 0; right <= (2*N + 1);) { if (ndiff_types == K) { best = min(best, nall); int i = left%N; compute_remove(ntypes, ndiff_types, stands[i], nall); left++; } else { int i = right%N; compute_add(ntypes, ndiff_types, stands[i], nall); right++; } } if (best == numeric_limits::max()) return -1; else return best; }