#include #include using namespace std; struct Kram { int pocet; bool * zmrzky; void nastav(int x, int y) { pocet = x; zmrzky = new bool[y]; for(int i = 0; i < y; i++) { zmrzky[i] = false; } } }; int main(void) { while(true) { int delka, pocet_z; cin >> delka; if(cin.eof()) break; cin >> pocet_z; Kram * pole = new Kram[delka]; for(int i = 0; i < delka; i++) { int x; cin >> x; pole[i].nastav(x, pocet_z); for(int j = 0; j < x; j++) { int cislo; cin >> cislo; pole[i].zmrzky[cislo - 1] = true; } } int min = INT_MAX; bool * mam = new bool[pocet_z]; for(int i = 0; i < delka; i++) { int pocet2 = pocet_z; long int koupil = 0; for(int ii = 0; ii < pocet_z; ii++) mam[ii] = false; for(int k = 0; k < delka; k++) { koupil += pole[(i + k) % delka].pocet; for(int j = 0; j < pocet_z; j++) { if(pole[(i + k) % delka].zmrzky[j] && !mam[j]) { mam[j] = true; pocet2--; } } if(pocet2 == 0) { if(koupil < min) { min = koupil; } k = delka; } } } if(min == INT_MAX) min = -1; cout << min << endl; for(int i = 0; i < delka; i++) { delete [] pole[i].zmrzky; } delete [] pole; delete [] mam; } return 0; }