#include <bits/stdc++.h>
using namespace std;
const int dx[]={1,0,0,-1,1,-1,-1,1};
const int dy[]={0,1,-1,0,1,1,-1,-1};
const int INF = 1e8;
const double EPS = 1e-8;
#define PB push_back
#define mk make_pair
#define fr first
#define sc second
#define reps(i,j,k) for(int i = (j); i < (k); ++i)
#define rep(i,j) reps(i,0,j)
#define MOD 1000000007
#define lengthof(x) (sizeof(x) / sizeof(*(x)))
typedef vector<int> vi;
typedef vector<vi> vvi;
typedef pair<int,int> Pii;
typedef pair<int,vi > P;
typedef unsigned long long ll;
struct edge
{
	int to;
	int cost;
	edge(){}
	edge(int _to,int _cost){
		to = _to;
		cost = _cost;
	}
};
struct node
{
	int to;
	int cost;
	int blood;
	node(){}
	node(int _to,int _cost,int _blood){
		to = _to;
		cost = _cost;
		blood = _blood;
	}
	bool operator<(const node &a)const{
		return cost > a.cost;
	}
};

vector < edge > graph[128];
int main(){
	int N,M,L,K,S,G;
	while(scanf("%d %d %d %d %d %d",&N ,&M ,&L ,&K, &S, &G),N){
		rep(i,128){
			graph[i].clear();
		}
		bool add_place[128]={false};
		rep(i,L){
			int tmp;
			scanf("%d" ,&tmp);
			add_place[tmp] = true;
		}
		rep(i,K){
			int a,b,c;
			scanf("%d %d %d" ,&a ,&b ,&c);
			graph[a].PB(edge(b,c));
			graph[b].PB(edge(a,c));
		}

		priority_queue < node > Q;
		Q.push(node(S,0,M));
		int memo[128][128];
		rep(i,128){
			rep(j,128){
				memo[i][j] = INF;
			}
		}


		int ans = -1;
		while( !Q.empty() ){
			node e = Q.top();Q.pop();
			if(memo[e.to][e.blood] != INF)continue;
			memo[e.to][e.blood] = e.cost;
			if(e.to == G){
				ans = e.cost;
				break;
			}

			if(add_place[e.to] && e.blood < M){
				Q.push(node(e.to,e.cost+1,e.blood+1));
			}

			rep(i,graph[e.to].size()){
				edge n = graph[e.to][i];
				if(e.blood - n.cost >= 0){
					Q.push(node(n.to,e.cost + n.cost,e.blood - n.cost));
				}

			}

		}

		if(ans != -1)printf("%d\n",ans);
		else puts("Help!");
	}
    return 0;
}