#include <cstdio>
#include <iostream>
#include <string>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;

#define rep(i, n)		reps (i, 0, n)
#define reps(i, f, n)	for (int i = f; i < (int)n; ++i)

struct Data {
	int pos, cool, cost;
	Data(int p, int c, int d) : pos(p), cool(c), cost(d) {}
	bool operator< (const Data& d)const {
		return cost > d.cost;
	}
};

struct Edge {
	int dst, cost;
	Edge(int d, int c) : dst(d), cost(c) {}
};

int main()
{
	int n, M, l, k, A, H;
	while(scanf("%d%d%d%d%d%d", &n, &M, &l, &k, &A, &H), n){
		vector<vector<Edge> > G(n);
		bool hascool[100] = {false};
		rep(i, l){
			int x;
			scanf("%d", &x);
			hascool[x] = true;
		}
		hascool[A] = hascool[H] = true;
		
		rep(i, k){
			int x, y, t;
			scanf("%d%d%d", &x, &y, &t);
			G[x].push_back(Edge(y, t));
			G[y].push_back(Edge(x, t));
		}
		
		int ans = -1;
		bool visited[100][101] = {{false}};
		priority_queue<Data> Q;
		
		Q.push(Data(A, M, 0));
		while(!Q.empty()){
			Data d = Q.top();
			Q.pop();
			if(visited[d.pos][d.cool])
				continue;
			
			visited[d.pos][d.cool] = true;
			if(d.pos == H){
				ans = d.cost;
				break;
			}
			
			rep(i, G[d.pos].size()){
				Edge e = G[d.pos][i];
				if(d.cool - e.cost >= 0){
					Q.push(Data(e.dst, d.cool-e.cost, d.cost+e.cost));
				}
			}
			
			if(hascool[d.pos] && d.cool < M)
				Q.push(Data(d.pos, d.cool+1, d.cost+1));
		}
		
		if(ans == -1)
			puts("Help!");
		else
			printf("%d\n", ans);
	}
	return 0;
}