#include<bits/stdc++.h>
using namespace std;

#define INF 1e9

vector<pair<int, int> > dijk(int s, int v, vector<vector<pair<int, int> > > adjlist){
    
    priority_queue <pair<int, int> > wait;
    vector<pair<int, int > > result(v, {INF, 0});          //first  コスト　　second　どこから来たか
    for(int i = 0; i < v; i++){
        result[i].first = INF;
    }

    //スタート地点を追加
    result[s].first = 0;
    //result[s].second.push_back(s);
    wait.push(make_pair(0, s));

    //ダイクストラ本体
    while(!wait.empty()){    //waitが空になるまで

        int nowpoint = wait.top().second;
        int nowcost = -wait.top().first;
        wait.pop();

        if(result[nowpoint].first < nowcost) continue;


        //今いる頂点と隣接しているすべての頂点をなめる
        for(int i = 0; i < adjlist[nowpoint].size(); i++){

            int nextpoint = adjlist[nowpoint][i].second;
            int nextcost = nowcost + adjlist[nowpoint][i].first;

            //現時点より安く到達できそうであれば、結果を更新して優先度付きキューに格納
            if(result[nextpoint].first > nextcost){
                
                result[nextpoint].first = nextcost;
                result[nextpoint].second = nowpoint;
                wait.push(make_pair(-nextcost, nextpoint));
            }
        }
    }
    
    return result;         //結果列を返す
}

int main(){
    
    while(1){
        int N, m, L, K, A, H; cin >> N >> m >> L >> K >> A >> H;
        if(!N) break;
        vector<int> l(L, 0);
        for(int i = 0; i < L; i++) cin >> l[i];
        vector<vector<int> > G(N, vector<int> (N, INF));
        for(int i = 0; i < K; i++){
            int a, b, t; cin >> a >> b >> t;
            G[a][b] = G[b][a] = t;
        }

        for(int i = 0; i < N; i++) G[i][i] = 0;
        
        for(int k = 0; k < N; k++){
            for(int i = 0; i < N; i++){
                for(int j = 0; j < N; j++){
                    G[i][j] = min(G[i][j], G[i][k] + G[k][j]);
                }
            }
        }

        map<int, int> M;
        for(int i = 1; i <= L; i++){
            M[i] = l[i - 1];
        }
        
        vector<vector<int> > NG(L + 2, vector<int> (L + 2, INF));
        for(int i = 0; i <= L + 1; i++){
            for(int j = 0; j <= L + 1; j++){
                int a, b;
                if(i == 0) a = A;
                else if(i == L + 1) a = H;
                else a = M[i];

                if(j == 0) b = A;
                else if(j == L + 1) b = H;
                else b = M[j];

                NG[i][j] = G[a][b];
                if(NG[i][j] > m) NG[i][j] = INF; 
            }
        }

        for(int i = 0; i < L + 2; i++) NG[i][i] = INF;

        vector<vector<pair<int, int> > > adjlist(L + 2);
        for(int i = 0; i < L + 2; i++){
            for(int j = 0; j < L + 2; j++){
                if(NG[i][j] != INF) adjlist[i].push_back({NG[i][j], j});
            }
        }

        vector<pair<int, int> > result(L + 2);
        result = dijk(0, L + 2, adjlist);

        int ans = 2 * result[L + 1].first - m;
        if(result[L + 1].first <= m) cout << result[L + 1].first << endl;
        else if(result[L + 1].first == INF) cout << "Help!" << endl;
        else cout << ans << endl;
        
    }
    return 0;
}


Measured memory_bytes: 3272