#include <cstdio>
#include <cmath>
#include <cstring>
#include <cstdlib>
#include <climits>
#include <queue>
#include <algorithm>
#include <vector>
#include <iostream>
#include <string>
using namespace std;
const int INF=0x10000000;
struct edge{
int from,to;
int cost;
edge(int f,int t,int c){from=f;to=t;cost=c;}
};
enum TYPE{HOME,CAKESHOP,CITYHALL,LANDMARK};
struct node:public vector<edge>{
TYPE type;
int calorie;
node(){type=LANDMARK;calorie=0;clear();}
};
typedef vector<node> graph;
int Nodeno(string s,int m){//文字列から頂点番号を取得する
if(s=="D")return 1;
if(s=="H")return 0;
if(s[0]=='L'){
int r;
sscanf(s.c_str(),"L%d",&r);
return 2+m+(r-1);
}else{
int r;
sscanf(s.c_str(),"C%d",&r);
return 2+(r-1);
}
}
typedef pair<int,int> dijk_state; //時間と頂点の番号
//ダイクストラ法
vector<int> dijkstra(graph &Graph,int s){
vector<int> result(Graph.size());
std::fill(result.begin(),result.end(),INF);
result[s]=0;
priority_queue<dijk_state,vector<dijk_state>,greater<dijk_state> > que;
for(unsigned int i=0;i<Graph[s].size();i++)que.push(dijk_state(Graph[s][i].cost,Graph[s][i].to));
while(!que.empty()){
dijk_state t=que.top();que.pop();if(result[t.second]<=t.first)continue;
result[t.second]=t.first;
if(Graph[t.second].type==CAKESHOP)continue; //ケーキ屋を通ったら、そこから別の所に移動することは出来ない
for(unsigned int i=0;i<Graph[t.second].size();i++){
if(result[Graph[t.second][i].to]<=t.first+Graph[t.second][i].cost)continue;
que.push(dijk_state(t.first+Graph[t.second][i].cost,Graph[t.second][i].to));
}
}
return result;
}
//グラフからランドマークを消去する
graph makeGraph(graph &Graph,int m){
int V=2+m;
graph result(V);
result[0].type=HOME;result[1].type=CITYHALL;
for(int i=0;i<m;i++){
result[i+2].type=CAKESHOP;result[i+2].calorie=Graph[i+1].calorie;
}
for(int i=0;i<V;i++){
vector<int> ret=dijkstra(Graph,i);
for(int j=0;j<V;j++){
if(ret[j]<INF){
result[i].push_back(edge(i,j,ret[j]));
}
}
}
return result;
}
struct BFS_state{
int node;
int accessed;
int calorie;
BFS_state(){}
BFS_state(int n,int a,int c){node=n;accessed=a;calorie=c;}
};
//最小の消費カロリーを求める
int MinimumCalorie(graph Graph){
//BFS
//O(m!*2^m)
int result=INT_MAX;
queue<BFS_state> que;
que.push(BFS_state(0,0,0));
while(!que.empty()){
BFS_state t=que.front();que.pop();
if(t.node==1){result=min(result,t.calorie);continue;}//市役所に到着
t.accessed|=1<<t.node;
if(t.node>=2){t.calorie-=Graph[t.node].calorie;}//ケーキ屋ならカロリーを入手出来る
for(unsigned int i=0;i<Graph[t.node].size();i++){
if((t.accessed>>Graph[t.node][i].to)&1)continue;
que.push(BFS_state(Graph[t.node][i].to,t.accessed,t.calorie+Graph[t.node][i].cost));
}
}
return result;
}
int main(){
while(1){
int m,n,k,d;
cin >> m >> n >> k >> d;
int V=1+1+m+n;//頂点数は家(1)+市役所(1)+ケーキ屋の個数(m)+ランドマークの個数(n)
if(V==2)break;//V=2の時は終了
graph Graph(V);//グラフとして表す
Graph[0].type=HOME;Graph[1].type=CITYHALL; //頂点0が家で、頂点1が市役所
for(int i=0;i<m;i++){
int t;cin >> t;Graph[i+2].type=CAKESHOP;Graph[i+1].calorie=t; //ケーキ屋である頂点の情報
}
for(int i=0;i<n;i++)Graph[i+2+m].type=LANDMARK; //ランドマークの情報の決定
for(int i=0;i<d;i++){//全ての道の情報を得る
string s1,s2;int D,c1,c2;
cin >> s1 >> s2 >> D;
c1=Nodeno(s1,m);c2=Nodeno(s2,m);
Graph[c1].push_back(edge(c1,c2,D*k));
Graph[c2].push_back(edge(c2,c1,D*k));
}
cout << MinimumCalorie(makeGraph(Graph,m)) << endl; //グラフを簡略化してBFSする
}
return 0;
}
I2luY2x1ZGUgPGNzdGRpbz4KI2luY2x1ZGUgPGNtYXRoPgojaW5jbHVkZSA8Y3N0cmluZz4KI2luY2x1ZGUgPGNzdGRsaWI+CiNpbmNsdWRlIDxjbGltaXRzPgojaW5jbHVkZSA8cXVldWU+CiNpbmNsdWRlIDxhbGdvcml0aG0+CiNpbmNsdWRlIDx2ZWN0b3I+CiNpbmNsdWRlIDxpb3N0cmVhbT4KI2luY2x1ZGUgPHN0cmluZz4KCnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgpjb25zdCBpbnQgSU5GPTB4MTAwMDAwMDA7CgpzdHJ1Y3QgZWRnZXsKCWludCBmcm9tLHRvOwoJaW50IGNvc3Q7CgllZGdlKGludCBmLGludCB0LGludCBjKXtmcm9tPWY7dG89dDtjb3N0PWM7fQp9OwoKZW51bSBUWVBFe0hPTUUsQ0FLRVNIT1AsQ0lUWUhBTEwsTEFORE1BUkt9OwpzdHJ1Y3Qgbm9kZTpwdWJsaWMgdmVjdG9yPGVkZ2U+ewoJVFlQRSB0eXBlOwoJaW50IGNhbG9yaWU7Cglub2RlKCl7dHlwZT1MQU5ETUFSSztjYWxvcmllPTA7Y2xlYXIoKTt9Cn07Cgp0eXBlZGVmIHZlY3Rvcjxub2RlPiBncmFwaDsKCmludCBOb2Rlbm8oc3RyaW5nIHMsaW50IG0pey8v5paH5a2X5YiX44GL44KJ6aCC54K555Wq5Y+344KS5Y+W5b6X44GZ44KLCglpZihzPT0iRCIpcmV0dXJuIDE7CglpZihzPT0iSCIpcmV0dXJuIDA7CglpZihzWzBdPT0nTCcpewoJCWludCByOwoJCXNzY2FuZihzLmNfc3RyKCksIkwlZCIsJnIpOwoJCXJldHVybiAyK20rKHItMSk7Cgl9ZWxzZXsKCQlpbnQgcjsKCQlzc2NhbmYocy5jX3N0cigpLCJDJWQiLCZyKTsKCQlyZXR1cm4gMisoci0xKTsKCX0KfQoKdHlwZWRlZiBwYWlyPGludCxpbnQ+IGRpamtfc3RhdGU7IC8v5pmC6ZaT44Go6aCC54K544Gu55Wq5Y+3Ci8v44OA44Kk44Kv44K544OI44Op5rOVCnZlY3RvcjxpbnQ+IGRpamtzdHJhKGdyYXBoICZHcmFwaCxpbnQgcyl7Cgl2ZWN0b3I8aW50PiByZXN1bHQoR3JhcGguc2l6ZSgpKTsKCXN0ZDo6ZmlsbChyZXN1bHQuYmVnaW4oKSxyZXN1bHQuZW5kKCksSU5GKTsKCXJlc3VsdFtzXT0wOwoJcHJpb3JpdHlfcXVldWU8ZGlqa19zdGF0ZSx2ZWN0b3I8ZGlqa19zdGF0ZT4sZ3JlYXRlcjxkaWprX3N0YXRlPiA+IHF1ZTsKCWZvcih1bnNpZ25lZCBpbnQgaT0wO2k8R3JhcGhbc10uc2l6ZSgpO2krKylxdWUucHVzaChkaWprX3N0YXRlKEdyYXBoW3NdW2ldLmNvc3QsR3JhcGhbc11baV0udG8pKTsKCXdoaWxlKCFxdWUuZW1wdHkoKSl7CgkJZGlqa19zdGF0ZSB0PXF1ZS50b3AoKTtxdWUucG9wKCk7aWYocmVzdWx0W3Quc2Vjb25kXTw9dC5maXJzdCljb250aW51ZTsKCQlyZXN1bHRbdC5zZWNvbmRdPXQuZmlyc3Q7CgkJaWYoR3JhcGhbdC5zZWNvbmRdLnR5cGU9PUNBS0VTSE9QKWNvbnRpbnVlOyAvL+OCseODvOOCreWxi+OCkumAmuOBo+OBn+OCieOAgeOBneOBk+OBi+OCieWIpeOBruaJgOOBq+enu+WLleOBmeOCi+OBk+OBqOOBr+WHuuadpeOBquOBhAoJCWZvcih1bnNpZ25lZCBpbnQgaT0wO2k8R3JhcGhbdC5zZWNvbmRdLnNpemUoKTtpKyspewoJCQlpZihyZXN1bHRbR3JhcGhbdC5zZWNvbmRdW2ldLnRvXTw9dC5maXJzdCtHcmFwaFt0LnNlY29uZF1baV0uY29zdCljb250aW51ZTsKCQkJcXVlLnB1c2goZGlqa19zdGF0ZSh0LmZpcnN0K0dyYXBoW3Quc2Vjb25kXVtpXS5jb3N0LEdyYXBoW3Quc2Vjb25kXVtpXS50bykpOwoJCX0KCX0KCXJldHVybiByZXN1bHQ7Cn0KCi8v44Kw44Op44OV44GL44KJ44Op44Oz44OJ44Oe44O844Kv44KS5raI5Y6744GZ44KLCmdyYXBoIG1ha2VHcmFwaChncmFwaCAmR3JhcGgsaW50IG0pewoJaW50IFY9MittOwoJZ3JhcGggcmVzdWx0KFYpOwoJcmVzdWx0WzBdLnR5cGU9SE9NRTtyZXN1bHRbMV0udHlwZT1DSVRZSEFMTDsKCWZvcihpbnQgaT0wO2k8bTtpKyspewoJCXJlc3VsdFtpKzJdLnR5cGU9Q0FLRVNIT1A7cmVzdWx0W2krMl0uY2Fsb3JpZT1HcmFwaFtpKzFdLmNhbG9yaWU7Cgl9Cglmb3IoaW50IGk9MDtpPFY7aSsrKXsKCQl2ZWN0b3I8aW50PiByZXQ9ZGlqa3N0cmEoR3JhcGgsaSk7CgkJZm9yKGludCBqPTA7ajxWO2orKyl7CgkJCWlmKHJldFtqXTxJTkYpewoJCQkJcmVzdWx0W2ldLnB1c2hfYmFjayhlZGdlKGksaixyZXRbal0pKTsKCQkJfQoJCX0KCX0KCXJldHVybiByZXN1bHQ7Cn0KCnN0cnVjdCBCRlNfc3RhdGV7CglpbnQgbm9kZTsKCWludCBhY2Nlc3NlZDsKCWludCBjYWxvcmllOwoJQkZTX3N0YXRlKCl7fQoJQkZTX3N0YXRlKGludCBuLGludCBhLGludCBjKXtub2RlPW47YWNjZXNzZWQ9YTtjYWxvcmllPWM7fQp9OwovL+acgOWwj+OBrua2iOiyu+OCq+ODreODquODvOOCkuaxguOCgeOCiwppbnQgTWluaW11bUNhbG9yaWUoZ3JhcGggR3JhcGgpewoJLy9CRlMKCS8vTyhtISoyXm0pCglpbnQgcmVzdWx0PUlOVF9NQVg7CglxdWV1ZTxCRlNfc3RhdGU+IHF1ZTsKCXF1ZS5wdXNoKEJGU19zdGF0ZSgwLDAsMCkpOwoJd2hpbGUoIXF1ZS5lbXB0eSgpKXsKCQlCRlNfc3RhdGUgdD1xdWUuZnJvbnQoKTtxdWUucG9wKCk7CgkJaWYodC5ub2RlPT0xKXtyZXN1bHQ9bWluKHJlc3VsdCx0LmNhbG9yaWUpO2NvbnRpbnVlO30vL+W4guW9ueaJgOOBq+WIsOedgAoJCXQuYWNjZXNzZWR8PTE8PHQubm9kZTsKCQlpZih0Lm5vZGU+PTIpe3QuY2Fsb3JpZS09R3JhcGhbdC5ub2RlXS5jYWxvcmllO30vL+OCseODvOOCreWxi+OBquOCieOCq+ODreODquODvOOCkuWFpeaJi+WHuuadpeOCiwoJCWZvcih1bnNpZ25lZCBpbnQgaT0wO2k8R3JhcGhbdC5ub2RlXS5zaXplKCk7aSsrKXsKCQkJaWYoKHQuYWNjZXNzZWQ+PkdyYXBoW3Qubm9kZV1baV0udG8pJjEpY29udGludWU7CgkJCXF1ZS5wdXNoKEJGU19zdGF0ZShHcmFwaFt0Lm5vZGVdW2ldLnRvLHQuYWNjZXNzZWQsdC5jYWxvcmllK0dyYXBoW3Qubm9kZV1baV0uY29zdCkpOwoJCX0KCX0KCXJldHVybiByZXN1bHQ7Cn0KCmludCBtYWluKCl7Cgl3aGlsZSgxKXsKCQlpbnQgbSxuLGssZDsKCQljaW4gPj4gbSA+PiBuID4+IGsgPj4gZDsKCQlpbnQgVj0xKzErbStuOy8v6aCC54K55pWw44Gv5a62KDEpK+W4guW9ueaJgCgxKSvjgrHjg7zjgq3lsYvjga7lgIvmlbAobSkr44Op44Oz44OJ44Oe44O844Kv44Gu5YCL5pWwKG4pCgoJCWlmKFY9PTIpYnJlYWs7Ly9WPTLjga7mmYLjga/ntYLkuoYKCgkJZ3JhcGggR3JhcGgoVik7Ly/jgrDjg6njg5XjgajjgZfjgabooajjgZkKCQlHcmFwaFswXS50eXBlPUhPTUU7R3JhcGhbMV0udHlwZT1DSVRZSEFMTDsgLy/poILngrkw44GM5a6244Gn44CB6aCC54K5MeOBjOW4guW9ueaJgAoJCWZvcihpbnQgaT0wO2k8bTtpKyspewoJCQlpbnQgdDtjaW4gPj4gdDtHcmFwaFtpKzJdLnR5cGU9Q0FLRVNIT1A7R3JhcGhbaSsxXS5jYWxvcmllPXQ7IC8v44Kx44O844Kt5bGL44Gn44GC44KL6aCC54K544Gu5oOF5aCxCgkJfQoJCWZvcihpbnQgaT0wO2k8bjtpKyspR3JhcGhbaSsyK21dLnR5cGU9TEFORE1BUks7IC8v44Op44Oz44OJ44Oe44O844Kv44Gu5oOF5aCx44Gu5rG65a6aCgoKCQlmb3IoaW50IGk9MDtpPGQ7aSsrKXsvL+WFqOOBpuOBrumBk+OBruaDheWgseOCkuW+l+OCiwoJCQlzdHJpbmcgczEsczI7aW50IEQsYzEsYzI7CgkJCWNpbiA+PiBzMSA+PiBzMiA+PiBEOwoJCQljMT1Ob2Rlbm8oczEsbSk7YzI9Tm9kZW5vKHMyLG0pOwoJCQlHcmFwaFtjMV0ucHVzaF9iYWNrKGVkZ2UoYzEsYzIsRCprKSk7CgkJCUdyYXBoW2MyXS5wdXNoX2JhY2soZWRnZShjMixjMSxEKmspKTsKCQl9CgoJCWNvdXQgPDwgTWluaW11bUNhbG9yaWUobWFrZUdyYXBoKEdyYXBoLG0pKSA8PCBlbmRsOyAvL+OCsOODqeODleOCkuewoeeVpeWMluOBl+OBpkJGU+OBmeOCiwoKCX0KCXJldHVybiAwOwp9Cg==