#include "bits/stdc++.h"
using namespace std;
typedef pair<int,int> P; 
class Edge
{
	public:
	int to,fee,length,com;//行き先、費用、時間、管理会社
	Edge(int t,int f,int l,int c)
	{
		to=t;fee=f;length=l;com=c;
	}
};

vector<Edge> g[100];
vector<int> pass[256];//1日乗車券の情報
int passcost[256]; //1日乗車券にかかる費用
int dp[1<<8][25][101];
//iに属する会社はただになるパスポートを使って時刻jにkに行く最小費用
int dp2[257][1<<8]; 
//i番目までのパスポートでjの集合の会社をすべて覆う1dayパスポートを買う費用の最小値

//dpを解く
void solvedp(int s,int maxh)
{
	fill(dp[0][0],dp[1<<8][0],1e8-1);
	deque<pair<int,P>> q;
	for(int pp=0;pp<(1<<8);pp++)
	{
		dp[pp][0][s]=0;
		q.push_back(make_pair(s,P(0,0)));
		while(!q.empty())
		{
			auto itr=q[0];q.pop_front();
			P p=itr.second;
			int now=itr.first;
			if(dp[pp][p.second][now]<p.first)
				continue;
			for(int i=0;i<g[now].size();i++)
			{
				Edge e=g[now][i];
				P newp=P(p.first+e.fee,p.second+e.length);
				if(pp&(1<<e.com))
					newp.first-=e.fee;//ただになる
				if(newp.second>maxh)
					continue;
				if(dp[pp][newp.second][e.to]>newp.first)
				{
					q.push_back(make_pair(e.to,newp));
					//cerr<<e.to<<" "<<newp.first<<" "<<newp.second<<endl;
					dp[pp][newp.second][e.to]=newp.first;
				}
			}
		}
	}
}
//dp2を解く
void solvedp2(int p)
{
	fill(dp2[0],dp2[257],1e8-1);
	dp2[0][0]=0; //どこも安くならないのは何も買わない場合
	for(int i=1;i<p+1;i++)
	{
		//i番目のチケットを構築する
		int pp=0; //i番目のチケットが持つ集合
		for(int j=0;j<pass[i-1].size();j++)
			pp|=(1<<pass[i-1][j]);
		for(int j=0;j<(1<<8);j++)
		{
			if(dp2[i-1][j]!=1e8-1)
			{
				dp2[i][j]=min(dp2[i][j],dp2[i-1][j]);
				dp2[i][j|pp]=dp2[i-1][j|pp];
				for(int k=0;k<(1<<8);k++)
				{
					if((pp|k)==(j|pp))
						dp2[i][j|pp]=min(dp2[i][j|pp],dp2[i-1][k]+passcost[i-1]);
				}
			}
		}
	}
	return;
}

int main()
{
	while(1)
	{
		int n,m,h,k;
		cin>>n>>m>>h>>k;
		if(n==0)
			break;
		int s,t;
		for(int i=0;i<256;i++)
			pass[i].clear();
		for(int i=0;i<100;i++)
			g[i].clear();
		for(int i=0;i<m;i++)
		{
			int a,b,c,t,r;
			cin>>a>>b>>c>>t>>r;
			a--;b--;r--;
			g[a].push_back(Edge(b,c,t,r));
			g[b].push_back(Edge(a,c,t,r));
		}
		cin>>s>>t;
		s--;t--;
		int p;
		cin>>p;
		for(int i=0;i<p;i++)
		{
			int l;
			cin>>l>>passcost[i];
			for(int j=0;j<l;j++)
			{
				int c;
				cin>>c;
				c--;
				pass[i].push_back(c);
			}
		}
		//input end
		solvedp(s,h);
		solvedp2(p);
		int ans=1e8-1;
		/* 
		for(int i=0;i<(1<<k);i++)
			cerr<<i<<" "<<dp2[p][i]<<endl;
		*/
		//すべての乗車券の買い方について見る
		for(int i=0;i<(1<<8);i++)
		{
			for(int j=0;j<=h;j++)
				ans=min(dp2[p][i]+dp[i][j][t],ans);
		}
		if(ans==1e8-1)
			ans=-1;
		cout<<ans<<endl;
	}
	return 0;
}
