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