#include<stdio.h>
#include<stdlib.h>
#define ll long long
#define rep(i,l,r)for(ll i=(l);i<(r);i++)
#define INF ((1LL<<62)-(1LL<<31))
#define min(p,q)((p)<(q)?(p):(q))
#define max(p,q)((p)>(q)?(p):(q))

ll cost[110][110];

//ワーシャルフロイド
//頂点数（と隣接行列）を引いて全点間最短距離を返す
//O(V^3)
ll dddd[110][110];
void waasharuhuroido(ll n){
	rep(i,0,n)rep(j,0,n)dddd[i][j]=cost[i][j];//辺が無いところはINFにする前処理が必要
	rep(k,0,n)rep(i,0,n)rep(j,0,n)dddd[i][j]=min(dddd[i][j],dddd[i][k]+dddd[k][j]);
}
	
ll a[110];
int main(){
	ll n,m,s,g,t,list;
	while(scanf("%lld%lld%lld%lld%lld%lld",&n,&t,&list,&m,&s,&g),n){
		rep(i,0,n)a[i]=0;
		rep(i,0,list){
			ll t;
			scanf("%lld",&t);
			a[t]=1;
		}
		a[s]=a[g]=1;

		rep(i,0,n)rep(j,0,n)cost[i][j]=i==j?0:INF;
		rep(i,0,m){
			ll x,y,c;
			scanf("%lld%lld%lld",&x,&y,&c);
			cost[x][y]=cost[y][x]=c;
		}

		waasharuhuroido(n);
		rep(i,0,n)rep(j,0,n){
			if(a[i]&&a[j]&&dddd[i][j]<=t)cost[i][j]=dddd[i][j];
			else cost[i][j]=INF;
		}
		waasharuhuroido(n);

		if(dddd[s][g]==INF)puts("Help!");
		else printf("%lld\n",dddd[s][g]+max(0,dddd[s][g]-t));
	}
}
