#include <stdio.h>
#include <cmath>
#include <algorithm>
#include <cfloat>
#include <stack>
#include <queue>
#include <vector>
typedef long long int ll;
#define BIG_NUM 2000000000
#define MOD 1000000007
#define EPS 0.000001
using namespace std;

struct Info{
	Info(int arg_town,int arg_time_sum,int arg_rest_time,int arg_pre_rest,int arg_after_iced_time,int arg_pre_add){
		town = arg_town;
		time_sum = arg_time_sum;
		rest_time = arg_rest_time;
		pre_rest = arg_pre_rest;
		after_iced_time = arg_after_iced_time;
		pre_add = arg_pre_add;
	}

	int town,time_sum,rest_time,pre_rest,after_iced_time,pre_add;
};

struct Data{
	Data(int arg_to,int arg_cost){
		to = arg_to;
		cost = arg_cost;
	}
	int to,cost;
};

void func(int N,int MAX_TIME,int L, int K,int START,int GOAL){

	int min_Time[N][MAX_TIME+1],tmp,from,to,time;
	bool has_ICE[N];

	vector<Data> V[N];

	for(int i = 0; i < N; i++){
		has_ICE[i] = false;
		for(int k = 0; k <= MAX_TIME; k++)min_Time[i][k] = BIG_NUM;
	}

	has_ICE[START] = true;
	has_ICE[GOAL] = true;
	min_Time[START][MAX_TIME] = 0;

	for(int i = 0; i < L; i++){
		scanf("%d",&tmp);
		has_ICE[tmp] = true;
	}

	for(int i = 0; i < K; i++){
		scanf("%d %d %d",&from,&to,&time);
		V[from].push_back(Data(to,time));
		V[to].push_back(Data(from,time));
	}

	queue<Info> Q;

	Q.push(Info(START,0,MAX_TIME,MAX_TIME,0,0));

	int next_town,cost;

	while(!Q.empty()){

		if(Q.front().time_sum > min_Time[Q.front().town][Q.front().rest_time]){
			Q.pop();
		}else{
			if(has_ICE[Q.front().town] && Q.front().town != START){

				if(Q.front().pre_rest >= Q.front().after_iced_time){
					Q.front().time_sum -= Q.front().pre_add;
					Q.front().pre_rest = Q.front().pre_rest - Q.front().after_iced_time;

					min_Time[Q.front().town][Q.front().pre_rest] = min(min_Time[Q.front().town][Q.front().pre_rest],Q.front().time_sum);

				}else{

					Q.front().time_sum -= Q.front().pre_add;
					Q.front().time_sum += Q.front().after_iced_time-Q.front().pre_rest;
					Q.front().pre_rest = 0;

					min_Time[Q.front().town][Q.front().pre_rest] = min(min_Time[Q.front().town][Q.front().pre_rest],Q.front().time_sum);
				}

				Q.front().after_iced_time = 0;
				Q.front().pre_add = MAX_TIME-Q.front().pre_rest;
				Q.front().time_sum += Q.front().pre_add;
				Q.front().rest_time = MAX_TIME;
			}

			if(Q.front().town == GOAL){
				Q.pop();
			}else{

				for(int i = 0; i < V[Q.front().town].size(); i++){
					next_town = V[Q.front().town][i].to;
					cost = V[Q.front().town][i].cost;

					if(Q.front().rest_time >= cost && min_Time[next_town][Q.front().rest_time-cost] > Q.front().time_sum+cost){
						min_Time[next_town][Q.front().rest_time-cost] = Q.front().time_sum+cost;
						Q.push(Info(next_town,Q.front().time_sum+cost,Q.front().rest_time-cost,Q.front().pre_rest,Q.front().after_iced_time+cost,Q.front().pre_add));
					}
				}

				Q.pop();
			}
		}
	}

	int ans = BIG_NUM;

	for(int i = 0; i <= MAX_TIME; i++){
		ans = min(ans,min_Time[GOAL][i]);
	}

	if(ans == BIG_NUM){
		printf("Help!\n");
	}else{
		printf("%d\n",ans);
	}
}

int main(){

	int N,M,L,K,A,H;

	while(true){
		scanf("%d %d %d %d %d %d",&N,&M,&L,&K,&A,&H);
		if(N == 0 && M == 0 && L == 0 && K == 0 && A == 0 && H == 0)break;

		func(N,M,L,K,A,H);
	}

	return 0;
}

Measured memory_bytes: 2944