#include using namespace std; #define FOR(i,a,b) for (int i = (a); i <= (b); i++) #define FORD(i,a,b) for (int i = (a); i >= (b); i--) #define REP(i,b) for (int i = 0; i < (b); i++) typedef long long ll; const int N = 1000000; const int K = 1000000; const int MAX = 1000 * 1000 * 10; int boxes[MAX]; int offsets[N]; int sizes[N]; bool exists[K]; int counts[K]; int main() { int n, k; while (scanf("%d%d", &n, &k) == 2) { REP(i, k) { exists[i] = false; counts[i] = 0; } int p = 0, count = 0; REP(i, n) { offsets[i] = p; scanf("%d", &sizes[i]); REP(j, sizes[i]) { int a; scanf("%d", &a); a--; boxes[p++] = a; if (!exists[a]) { exists[a] = true; count++; } } } if (count < k) { printf("-1\n"); continue; } int end = -1; int filled = 0; ll cost = 0; ll ans = p; REP(beg, n) { while (filled < k) { end++; if (end == n) end = 0; REP(i, sizes[end]) { int a = boxes[offsets[end] + i]; if (counts[a] == 0) { filled++; } counts[a]++; } cost += sizes[end]; } ans = min(ans, cost); REP(i, sizes[beg]) { int a = boxes[offsets[beg] + i]; counts[a]--; if (counts[a] == 0) { filled--; } } cost -= sizes[beg]; } printf("%lld\n", ans); } return 0; }