#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_; 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); } } long ret = 100000001; // 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 } } } } printf("%ld\n", (ret == 100000001 ? -1 : ret)); } return 0; }