code:
#include <bits/stdc++.h>
using namespace std;
typedef pair<pair<int, int> , vector<int>> PII;
typedef pair<int, int> PIII;
constexpr int N = 3009;
int n, m,p,k;
vector<PII> g[N];
int dist[N];
bool st[N];
vector<int> a[N];
bitset<19> q;
void dijkstra(int Start) {
memset(dist, 0x3f, sizeof(dist));
memset(st, false, sizeof(st));
dist[Start] = 0;
priority_queue<PIII, vector<PIII>, greater<PIII>> heap;
heap.push(make_pair(0, Start));
while (!heap.empty()) {
auto t = heap.top();
heap.pop();
int ver = t.second, distance = t.first;
for(auto it:a[ver]) q[it] = 1;
if (st[ver]) continue;
st[ver] = true;
for (const auto &it : g[ver]) {
int to = it.first.first, val = it.first.second;
vector<int> ccc = it.second;
bool c = 1;
for(auto ti : ccc){
c &= q[ti];
}
if(!c) continue;
if (dist[to] > dist[ver] + val) {
dist[to] = dist[ver] + val;
heap.push(make_pair(dist[to], to));
}
}
}
}
int main() {
cin >> n >> m >> p >> k;
for(int i = 1;i<=k;i++){
int x,zzz;
cin >> x >> zzz;
for(int j = 1;j<=zzz;j++){
int y;
cin >> y;
a[x].push_back(y);
}
}
for (int i = 0; i < m; i++) {
int u, v, w;
cin >> u >> v >> w;
vector<int> ccc;
int c;
cin >> c;
for(int j = 0;j<c;j++){
int x;
cin >> x;
ccc.push_back(x);
}
g[u].push_back({{v,w},ccc});
g[v].push_back({{u,w},ccc});
}
dijkstra(1);
if (dist[n] == 0x3f3f3f3f) {
cout << "-1\n";
} else {
cout << dist[n] << "\n";
}
return 0;
}