#include <bits/stdc++.h>
using namespace std;
const int N = 35; // n ≤ 30
const int M = 15; // m ≤ 10
int n, m;
vector<int> canTeach[M]; // danh sách môn mà giáo viên có thể dạy
bool conflict[N][N]; // conflict[i][j] = true nếu môn i và j xung đột
int x[N]; // x[i] = giáo viên dạy môn i
int loadTeacher[M]; // tải hiện tại của từng giáo viên
int res = 1e9; // kết quả tốt nhất
bool teachable[M][N]; // teachable[t][c] = true nếu gv t có thể dạy môn c
// Kiểm tra xem giáo viên t có thể dạy môn c hợp lệ không
bool canAssign(int c, int t) {
if (!teachable[t][c]) return false;
for (int i = 1; i < c; i++) {
if (x[i] == t && conflict[i][c]) return false; // cùng gv và xung đột
}
return true;
}
void Try(int c) {
for (int t = 1; t <= m; t++) {
if (canAssign(c, t)) {
x[c] = t;
loadTeacher[t]++;
int curMax = *max_element(loadTeacher + 1, loadTeacher + m + 1);
// nếu tải hiện tại đã >= res thì cắt nhánh
if (curMax < res) {
if (c == n) res = curMax; // tìm được nghiệm hợp lệ
else Try(c + 1);
}
loadTeacher[t]--; // backtrack
}
}
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin >> m >> n;
for (int t = 1; t <= m; t++) {
int k; cin >> k;
while (k--) {
int course; cin >> course;
teachable[t][course] = true;
}
}
int k; cin >> k;
while (k--) {
int a, b; cin >> a >> b;
conflict[a][b] = conflict[b][a] = true;
}
Try(1);
if (res == 1e9) cout << -1;
else cout << res;
}