#include <bits/stdc++.h>
using namespace std;
#define rep(i,n) repi(i,0,n)
#define repi(i,a,b) for(int i=(int)(a);i < (int)(b);++i)
#define long long long
constexpr long inf = 1e15;
using edge = pair<long, int>;
int main() {
    while (true) {
        int N, M, L, K, A, H;
        cin >> N >> M >> L >> K >> A >> H;
        if(N == 0)return 0;
        vector<int> T(L);
        rep(i, L)cin >> T[i];
        T.push_back(A);
        T.push_back(H);

        vector<vector<long>> D(N, vector<long>(N, inf));
        rep(i, N)D[i][i] = 0;
        rep(i, K)
        {
            int x,y; long t;
            cin >> x >> y >> t;
            D[x][y] = t;
            D[y][x] = t;
        }
        rep(k, N)rep(i, N)rep(j, N)D[i][j] = min(D[i][j], D[i][k] + D[k][j]);

        vector<long> time(N, inf);
        time[A] = 0;
        priority_queue<edge, vector<edge>, greater<edge>> Q;
        Q.push(edge(0, A));

        while(Q.size())
        {
            auto p = Q.top(); Q.pop();
            auto v = p.second;
            auto cost = p.first;
            if(time[v] < cost)continue;

            int remain = 0;
            if(cost < M)remain = M - cost;
            for(auto e : T)
            {
                if(e == v)continue;
                auto dist = D[v][e];
                if(dist > M)continue;
                auto add_time = dist;
                if(dist > remain)add_time += (dist - remain);
                auto d = cost + add_time;
                if(d < time[e])
                {
                    time[e] = d;
                    Q.push(edge(d, e));
                }
            }
        }
        
        if(time[H] == inf)cout << "Help!" << endl;
        else cout << time[H] << endl;
  
    }
}

