#include <iostream>
#include <iomanip>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <map>
#include <set>
#include <list>
#include <queue>
#include <deque>
#include <stack>
#include <vector>
#include <algorithm>
#include <functional>
#include <cstring>
#include <string>
#include <sstream>
#include <bitset>
using namespace std;
#define INF	100000000
#define MOD 1000000007
#define pb push_back
#define mp make_pair
#define fi first
#define sec second
#define lb lower_bound
#define ub upper_bound
#define SS stringstream
#define rep(i,n) for(int i = 0; i < n; i++)
#define SORT(x) sort((x).begin(), (x).end())
#define clr(a,b) memset((a),(b),sizeof(a))
typedef long long int ll;
typedef pair<int, int> P;
typedef vector<int> Vi;
typedef vector<ll> Vll;
typedef vector<P> Vp;
typedef priority_queue<P, vector<P>, greater<P> > PQ;

int n, m, l, k, a, h;
int imp[100];
int d[100][100],dis[100][100],dist[100];
bool used[100];

void dijkstra(int s,int V){
	fill(dist, dist+V, INF);
	fill(used, used+V, false);
	dist[s] = 0;
	
	while(true){
		int v = -1;
		
		for(int u = 0; u < V; u++){
			if(!used[u] && (v == -1 || dist[u] < dist[v])) v = u;
		}
		
		if(v == -1) break;
		used[v] = true;
		
		for(int u = 0; u < V; u++){
			dist[u] = min(dist[u], dist[v] + dis[v][u]);
		}
	}
}

void solve(){
	rep(i,100) rep(j,100){
		d[i][j] = INF;
		dis[i][j] = INF;
	}
	rep(i,100) d[i][i] = 0;
	rep(i,100) dis[i][i] = 0;
	imp[0] = a;
	rep(i,l) scanf("%d", &imp[i+1]);
	imp[l+1] = h;
	rep(i,k){
		int x, y, t;
		scanf("%d%d%d", &x, &y, &t);
		d[x][y] = t;
		d[y][x] = t;
	}
	rep(u,n) rep(i,n) rep(j,n) d[i][j] = min(d[i][j],d[i][u]+d[u][j]);
	rep(i,l+2){
		rep(j,l+2){
			if(d[imp[i]][imp[j]] <= m) dis[i][j] = d[imp[i]][imp[j]];
		}
	}
	dijkstra(0, l+2);
	if(dist[l+1] == INF) printf("Help!\n");
	else if(dist[l+1] < m) printf("%d\n", dist[l+1]);
	else printf("%d\n", dist[l+1]*2-m);
}

int main(){
	while(scanf("%d%d%d%d%d%d",&n,&m,&l,&k,&a,&h),n||m||l||k||a||h) solve();
}