#include<iostream>
#include<vector>
#include<algorithm>
#include<queue>
#include<tuple>
#include<functional>
using namespace std;

#define MAX_N 200
#define INF 101010101

int N,M,L,K,A,H,a1,a2,a3;
vector<pair<int,int>>X[MAX_N];
int dp[MAX_N][MAX_N];
int p[MAX_N];

priority_queue<tuple<int,int,int>,vector<tuple<int,int,int>>,greater<tuple<int,int,int>>>Q;

int main(){
	while(true){
		for(int i=0;i<MAX_N;i++){
			for(int j=0;j<MAX_N;j++){
				dp[i][j]=INF;
			}
		}
		for(int i=0;i<MAX_N;i++){
			X[i].clear();
			p[i]=0;
		}
		cin>>N>>M>>L>>K>>A>>H;
		if(N==0 && M==0 && L==0 && K==0 && A==0 && H==0){
			break;
		}
		for(int i=0;i<L;i++){
			cin>>a1;
			p[a1]=1;
		}
		for(int i=0;i<K;i++){
			cin>>a1>>a2>>a3;
			X[a1].push_back(make_pair(a2,a3));
			X[a2].push_back(make_pair(a1,a3));
		}
		Q.push(make_tuple(0,A,M));
		dp[A][M]=0;
		while(!Q.empty()){
			tuple<int,int,int>tup=Q.top();
			Q.pop();
			int b1=get<0>(tup);
			int b2=get<1>(tup);
			int b3=get<2>(tup);
			if(b3<M && p[b2]==1){
				if(dp[b2][b3+1]>dp[b2][b3]+1){
					dp[b2][b3+1]=dp[b2][b3]+1;
					Q.push(make_tuple(dp[b2][b3+1],b2,b3+1));
				}
			}
			for(int i=0;i<X[b2].size();i++){
				int c1=X[b2][i].first;
				int c2=X[b2][i].second;
				if(b3>=c2){
					if(dp[c1][b3-c2]>dp[b2][b3]+c2){
						dp[c1][b3-c2]=dp[b2][b3]+c2;
						Q.push(make_tuple(dp[c1][b3-c2],c1,b3-c2));
					}
				}
			}
		}
		int minx=INF;
		for(int i=0;i<=M;i++){
			minx=min(minx,dp[H][i]);
		}
		if(minx==INF){
			cout<<"Help!"<<endl;
		}
		else{
			cout<<minx<<endl;
		}
	}
	return 0;
}