#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=300,M=3010;
struct node {
int v,w,id;
};
bool check[N],vis[N];
int dis[N],t,z,num,x,y,n,m,q,k,ans;
vector <int> e[M],g[N];
vector <node> edge[N];
set <int> h;
void di(int u){
dis[u]=0;
for (int j=0;j<g[u].size();j++){
h.insert(g[u][j]);
}
for (int i=1;i<n;i++){
int p=0;
for (int j=1;j<=n;j++){
if (!vis[j] && (p==0 || dis[j]<dis[p])){
p=j;
}
}
for (int j=0;j<g[p].size();j++){
h.insert(g[p][j]);
}
vis[p]=1;
for (int j=0;j<edge[p].size();j++){
int v=edge[p][j].v;
int w=edge[p][j].w;
int id=edge[p][j].id;
bool f=0;
for(int j=0;j<e[id].size();j++){
if (h.find(e[id][j])==h.end()){
f=1;
break;
}
}
if(f==0){
dis[v]=min(dis[v],dis[p]+w);
}
}
}
}
signed main (){
memset(dis,0x1f,sizeof dis);
cin>>n>>m>>q>>k;
for (int i=1;i<=k;i++){
cin>>x>>y;
for (int j=1;j<=y;j++){
cin>>num;
g[x].push_back(num);
}
}
for (int i=1;i<=m;i++){
cin>>x>>y>>t>>z;
edge[x].push_back({y,t,i});
edge[y].push_back({x,t,i});
for(int j=1;j<=z;j++){
cin>>num;
e[i].push_back(num);
}
}
di(1);
if(dis[n]>1e9){
cout<<-1;
}
else{
cout<<dis[n];
}
return 0;
}