#include<iostream>
#include<vector>
#include<algorithm>

using namespace std;

struct edge{
  int b,c,h,r;
};

int main(){
  for(int N,M,H,K;cin>>N>>M>>H>>K,N|M|H|K;){
    vector<edge> edges[123];
    for(int i=0;i<M;i++){
      int a,b,c,h,r;
      cin>>a>>b>>c>>h>>r;
      edges[a].push_back({b,c,h,r});
      edges[b].push_back({a,c,h,r});
    }
    int S,T;
    cin>>S>>T;
    int P;
    cin>>P;
    int p[1<<9];
    fill(begin(p),end(p),1e9);
    p[0]=0;
    for(int i=0;i<P;i++){
      int l,d;
      cin>>l>>d;
      int b=0;
      while(l--){
	int k;
	cin>>k;
	b|=1<<k;
      }
      p[b]=d;
    }
    for(int i=0;i<1<<8;i++){
      for(int j=0;j<1<<8;j++){
	if(!(j&~i)){
	  for(int k=0;k<1<<8;k++){
	    if(!(k&~i)&&(j|k)==i){
	      p[i<<1]=min(p[i<<1],p[j<<1]+p[k<<1]);
	    }
	  }
	}
      }
    }
    int ans=1e9;
    for(int i=0;i<1<<9;i++){
      int dp[99][123];
      fill(*begin(dp),*end(dp),1e9);
      dp[0][S]=p[i];
      for(int j=0;j<H;j++){
	for(int k=0;k<=N;k++){
	  dp[j+1][k]=min(dp[j+1][k],dp[j][k]);
	  for(auto e:edges[k]){
	    dp[j+e.h][e.b]=min(dp[j+e.h][e.b],dp[j][k]+((i>>e.r&1)?0:e.c));
	  }
	}
      }
      ans=min(ans,dp[H][T]);
    }
    cout<<((ans<1e8)?ans:-1)<<endl;
  }
}

	    