#include <iostream>
#include <vector>
#include <algorithm>
#include <queue>
#include <map>
#include <set>
using namespace std;
typedef long long ll;

ll dp[101][25];
vector<pair<int,pair<int,int>>> g[101];
ll dp2[1<<8];

int main(){
	cin.tie(nullptr);
	ios::sync_with_stdio(false);
	int n,m,h,k;
	while(1){
		cin >> n >> m >> h >> k;
		if(n==0&&m==0&&h==0&&k==0)break;
		for(int i=0;i<n;i++){
			for(int j=0;j<=h;j++){
				dp[i][j]=1e18;
			}
		}
		for(int i=0;i<n;i++){
			g[i].clear();
		}
		map<pair<int,int>,int> mp;
		for(int i=0;i<m;i++){
			int a,b,c,d,e; cin >> a >> b >> c >> d >> e;
			a--; b--;
			e--;
			g[a].push_back(make_pair(b,make_pair(c,d)));
			g[b].push_back(make_pair(a,make_pair(c,d)));
			mp[make_pair(a,b)]=e;
			mp[make_pair(b,a)]=e;
		}
		int s,t; cin >> s >> t;
		s--; t--;
		int p; cin >> p;
		for(int i=0;i<(1<<k);i++){
			dp2[i]=1e15;
		}
		vector<pair<int,ll>> v(p);
		for(int i=0;i<p;i++){
			int kk; cin >> kk;
			int d; cin >> d;
			int res=0;
			for(int j=0;j<kk;j++){
				int e; cin >> e;
				e--;
				res+=(1<<e);
			}
			v[i]=make_pair(res,d);
		}
		dp2[0]=0;
		for(int i=0;i<(1<<k);i++){
			if(dp2[i]>=1e15)continue;
			for(int j=0;j<p;j++){
				dp2[i|v[j].first]=min(dp2[i|v[j].first],dp2[i]+v[j].second);
			}
		}
		ll res=1e18;
		for(int ii=0;ii<(1<<k);ii++){
			if(dp2[ii]>=1e15)continue;
			for(int i=0;i<n;i++){
				for(int j=0;j<=h;j++){
					dp[i][j]=1e18;
				}
			}
			priority_queue<pair<int,pair<int,int>>> q;
			q.push(make_pair(0,make_pair(s,0)));
			dp[s][0]=0;
			while(q.size()){
				auto p=q.top(); q.pop();
				if(-p.first>dp[p.second.first][p.second.second])continue;
				for(auto t:g[p.second.first]){
					if(p.second.second+t.second.second>h)continue;
					int ee=mp[make_pair(p.second.first,t.first)];
					if((1<<ee)&ii){
						if(dp[t.first][p.second.second+t.second.second]>dp[p.second.first][p.second.second]){
							dp[t.first][p.second.second+t.second.second]=dp[p.second.first][p.second.second];
							q.push(make_pair(-dp[t.first][p.second.second+t.second.second],make_pair(t.first,p.second.second+t.second.second)));
						}
					}
					else{
						if(dp[t.first][p.second.second+t.second.second]>dp[p.second.first][p.second.second]+t.second.first){
							dp[t.first][p.second.second+t.second.second]=dp[p.second.first][p.second.second]+t.second.first;
							q.push(make_pair(-dp[t.first][p.second.second+t.second.second],make_pair(t.first,p.second.second+t.second.second)));
						}
					}
				}
			}
			ll mi=1e18;
			for(int i=0;i<=h;i++){
				mi=min(dp[t][i],mi);
			}
			res=min(res,mi+dp2[ii]);
		}
		if(res>=1e15){
			cout << -1 << endl;
		}else{
			cout << res << endl;
		}
	}
	return 0;
}
