#include <bits/stdc++.h>
using namespace std;
const int maxN = 35, maxM = 35;
int n, m, prefer[maxN][maxM], conflict[maxN][maxN];
int X[maxN]; // X[i] = j nghĩa là giáo viên j được giao dạy môn i
int nbTeach[maxM]; // nbTeach[i] = số lượng môn học đã giao cho giáo viên i
int maxLoad = 1000000;
bool check(int v, int k) {
if (prefer[k][v] == 0) return false; // Giáo viên v không dạy được môn k
for (int i = 1; i <= k - 1; i++) { // Kiểm tra các môn đã phân công trước đó
// Môn k và i xung đột và cùng do giáo viên v dạy
if (conflict[k][i] == 1 && X[i] == v) return false;
}
return true;
}
void Try(int k) { // Thử X[k] -> tìm giáo viên dạy môn k
for (int v = 1; v <= m; v++) {
if (check(v, k)) {
X[k] = v;
nbTeach[v]++;
if (k == n) {
int load = 0;
for (int i = 1; i <= m; i++) {
load = max(load, nbTeach[i]);
}
maxLoad = min(maxLoad, load);
} else {
if (nbTeach[v] < maxLoad) // Nhánh cận
Try(k + 1);
}
nbTeach[v]--; // Quay lui
}
}
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cin >> m >> n;
for (int j = 1; j <= m; j++) {
int numPrefer;
cin >> numPrefer;
for (int i = 1; i <= numPrefer; i++) {
int preferClass;
cin >> preferClass;
prefer[preferClass][j] = 1;
}
}
int numConflict;
cin >> numConflict;
for (int i = 1; i <= numConflict; i++) {
int class1, class2;
cin >> class1 >> class2;
conflict[class1][class2] = 1;
conflict[class2][class1] = 1;
}
Try(1);
if (maxLoad == 1000000) cout << -1;
else cout << maxLoad;
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgpjb25zdCBpbnQgbWF4TiA9IDM1LCBtYXhNID0gMzU7CmludCBuLCBtLCBwcmVmZXJbbWF4Tl1bbWF4TV0sIGNvbmZsaWN0W21heE5dW21heE5dOwppbnQgWFttYXhOXTsgICAgICAgLy8gWFtpXSA9IGogbmdoxKlhIGzDoCBnacOhbyB2acOqbiBqIMSRxrDhu6NjIGdpYW8gZOG6oXkgbcO0biBpCmludCBuYlRlYWNoW21heE1dOyAvLyBuYlRlYWNoW2ldID0gc+G7kSBsxrDhu6NuZyBtw7RuIGjhu41jIMSRw6MgZ2lhbyBjaG8gZ2nDoW8gdmnDqm4gaQppbnQgbWF4TG9hZCA9IDEwMDAwMDA7Cgpib29sIGNoZWNrKGludCB2LCBpbnQgaykgewogICAgaWYgKHByZWZlcltrXVt2XSA9PSAwKSByZXR1cm4gZmFsc2U7IC8vIEdpw6FvIHZpw6puIHYga2jDtG5nIGThuqF5IMSRxrDhu6NjIG3DtG4gawogICAgZm9yIChpbnQgaSA9IDE7IGkgPD0gayAtIDE7IGkrKykgeyAgIC8vIEtp4buDbSB0cmEgY8OhYyBtw7RuIMSRw6MgcGjDom4gY8O0bmcgdHLGsOG7m2MgxJHDswogICAgICAgIC8vIE3DtG4gayB2w6AgaSB4dW5nIMSR4buZdCB2w6AgY8O5bmcgZG8gZ2nDoW8gdmnDqm4gdiBk4bqheQogICAgICAgIGlmIChjb25mbGljdFtrXVtpXSA9PSAxICYmIFhbaV0gPT0gdikgcmV0dXJuIGZhbHNlOwogICAgfQogICAgcmV0dXJuIHRydWU7Cn0KCnZvaWQgVHJ5KGludCBrKSB7IC8vIFRo4butIFhba10gLT4gdMOsbSBnacOhbyB2acOqbiBk4bqheSBtw7RuIGsKICAgIGZvciAoaW50IHYgPSAxOyB2IDw9IG07IHYrKykgewogICAgICAgIGlmIChjaGVjayh2LCBrKSkgewogICAgICAgICAgICBYW2tdID0gdjsKICAgICAgICAgICAgbmJUZWFjaFt2XSsrOwoKICAgICAgICAgICAgaWYgKGsgPT0gbikgewogICAgICAgICAgICAgICAgaW50IGxvYWQgPSAwOwogICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPD0gbTsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgbG9hZCA9IG1heChsb2FkLCBuYlRlYWNoW2ldKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIG1heExvYWQgPSBtaW4obWF4TG9hZCwgbG9hZCk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBpZiAobmJUZWFjaFt2XSA8IG1heExvYWQpIC8vIE5ow6FuaCBj4bqtbgogICAgICAgICAgICAgICAgICAgIFRyeShrICsgMSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG5iVGVhY2hbdl0tLTsgLy8gUXVheSBsdWkKICAgICAgICB9CiAgICB9Cn0KCmludCBtYWluKCkgewogICAgaW9zX2Jhc2U6OnN5bmNfd2l0aF9zdGRpbyhmYWxzZSk7CiAgICBjaW4udGllKE5VTEwpOwoKICAgIGNpbiA+PiBtID4+IG47CiAgICBmb3IgKGludCBqID0gMTsgaiA8PSBtOyBqKyspIHsKICAgICAgICBpbnQgbnVtUHJlZmVyOwogICAgICAgIGNpbiA+PiBudW1QcmVmZXI7CiAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPD0gbnVtUHJlZmVyOyBpKyspIHsKICAgICAgICAgICAgaW50IHByZWZlckNsYXNzOwogICAgICAgICAgICBjaW4gPj4gcHJlZmVyQ2xhc3M7CiAgICAgICAgICAgIHByZWZlcltwcmVmZXJDbGFzc11bal0gPSAxOwogICAgICAgIH0KICAgIH0KCiAgICBpbnQgbnVtQ29uZmxpY3Q7CiAgICBjaW4gPj4gbnVtQ29uZmxpY3Q7CiAgICBmb3IgKGludCBpID0gMTsgaSA8PSBudW1Db25mbGljdDsgaSsrKSB7CiAgICAgICAgaW50IGNsYXNzMSwgY2xhc3MyOwogICAgICAgIGNpbiA+PiBjbGFzczEgPj4gY2xhc3MyOwogICAgICAgIGNvbmZsaWN0W2NsYXNzMV1bY2xhc3MyXSA9IDE7CiAgICAgICAgY29uZmxpY3RbY2xhc3MyXVtjbGFzczFdID0gMTsKICAgIH0KCiAgICBUcnkoMSk7CgogICAgaWYgKG1heExvYWQgPT0gMTAwMDAwMCkgY291dCA8PCAtMTsKICAgIGVsc2UgY291dCA8PCBtYXhMb2FkOwoKICAgIHJldHVybiAwOwp9