#include <bits/stdc++.h>

using namespace std;

const int INF = 1e9 + 7;

struct Droga {
    int cel;
    int czas;
    int potwory;
};

struct Stan {
    int czas;
    int w;
    int miecze;

    bool operator>(const Stan& inny) const {
        return czas > inny.czas;
    }
};

int main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);

    int n, m, p, k;
    if (!(cin >> n >> m >> p >> k)) return 0;

    vector<int> kowal(n + 1, 0);
    for (int i = 0; i < k; ++i) {
        int w, q;
        cin >> w >> q;
        int maska = 0;
        for (int j = 0; j < q; ++j) {
            int r;
            cin >> r;
            maska |= (1 << (r - 1));
        }
        kowal[w] |= maska;
    }

    vector<vector<Droga>> graf(n + 1);
    for (int i = 0; i < m; ++i) {
        int v, w, t, s;
        cin >> v >> w >> t >> s;
        int maska_potworow = 0;
        for (int j = 0; j < s; ++j) {
            int u;
            cin >> u;
            maska_potworow |= (1 << (u - 1));
        }
        graf[v].push_back({w, t, maska_potworow});
        graf[w].push_back({v, t, maska_potworow});
    }

    vector<vector<int>> odl(n + 1, vector<int>(1 << p, INF));
    priority_queue<Stan, vector<Stan>, greater<Stan>> kolejka;

    int start_miecze = kowal[1];
    odl[1][start_miecze] = 0;
    kolejka.push({0, 1, start_miecze});

    int wynik = -1;

    while (!kolejka.empty()) {
        Stan akt = kolejka.top();
        kolejka.pop();

        if (akt.czas > odl[akt.w][akt.miecze]) continue;

        if (akt.w == n) {
            wynik = akt.czas;
            break;
        }

        for (auto& krawedz : graf[akt.w]) {
            if ((akt.miecze & krawedz.potwory) == krawedz.potwory) {
                int nowe_miecze = akt.miecze | kowal[krawedz.cel];
                if (akt.czas + krawedz.czas < odl[krawedz.cel][nowe_miecze]) {
                    odl[krawedz.cel][nowe_miecze] = akt.czas + krawedz.czas;
                    kolejka.push({odl[krawedz.cel][nowe_miecze], krawedz.cel, nowe_miecze});
                }
            }
        }
    }

    cout << wynik << "\n";

    return 0;
}