#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;
}