#include #include //#include using namespace std; void UnionSets(set &dest, set &source) { for (auto it = source.begin(); it != source.end(); ++it) dest.insert(*it); } int main() { int N, K; while (scanf("%d %d", &N, &K) != EOF) { int kioskS[N], kioskS_; set kioskB[N], kioskB_, totalB; for (int i = 0; i < N; i++) { int x; scanf("%d", &x); kioskS[i] = x; for (int j = 0; j < x; j++) { int brand; scanf("%d", &brand); kioskB[i].insert(brand); totalB.insert(brand); } } long ret = 100000001; if (totalB.size() < K) { printf("-1\n"); continue; } // ostro mensie for (int i = 0; i < N; i++) { kioskS_ = 0; kioskB_.clear(); for (int j = 0; j < N; j++) { //UnionSets(kioskB_, kioskB[(i + j) % N]); kioskB_.insert(kioskB[(i + j) % N].begin(), kioskB[(i + j) % N].end()); kioskS_ += kioskS[(i + j) % N]; if (kioskB_.size() >= K) { if (ret > kioskS_) { ret = kioskS_; break; //skip the rest of the stamnds } } } } // assert ret < 100000001; printf("%ld\n", ret); } return 0; }