#include<iostream>
#include<vector>
#include<algorithm>
#include<cctype>
#include<utility>
#include<string>
#include<cmath>
#include<cstring>
#include<queue>
#include<map>
#include<set>
#include<tuple>

#define REP(i, n) for(int i = 0;i < n;i++)
#define REPR(i, n) for(int i = n;i >= 0;i--)
#define FOR(i, m, n) for(int i = m;i < n;i++)
#define FORR(i, m, n) for(int i = m;i >= n;i--)
#define SORT(v, n) sort(v, v+n);
#define VSORT(v) sort(v.begin(), v.end());
#define llong long long
#define pb(a) push_back(a)

using namespace std;

typedef long long int ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
typedef tuple<int, int, int> tiii;


template<typename T>
vector<T> make_v(size_t a) { return vector<T>(a); }
template<typename T, typename... Ts>
auto make_v(size_t a, Ts... ts) {
	return vector<decltype(make_v<T>(ts...))>(a, make_v<T>(ts...));
}
template<typename T, typename V>
typename enable_if<is_class<T>::value == 0>::type
fill_v(T& t, const V& v) { t = v; }
template<typename T, typename V>
typename enable_if<is_class<T>::value != 0>::type
fill_v(T& t, const V& v) {
	for (auto& e : t) fill_v(e, v);
}


#define ARRAY_MAX 100005
int dx[4] = { 1,0,0,-1 };
int dy[4] = { 0,1,-1,0 };
const int MOD = 1e9 + 7;
const int INF = 1e9 + 7;

ll n, m, y, z;
char c[15];
int p[15];
string s;

#define DEBUG 1

struct node {

	int to;
	int cost;

};


int main() {

	int n, m, l, k, a, h;
	while (cin >> n >> m >> l >> k >> a >> h, n | m | l | k | a | h) {

		int cold[105] = {  };
		auto G = make_v<node>(105, 0);
	
		for (int i = 0; i < l; i++)
		{
			int tmp;
			cin >> tmp;
			cold[tmp] = 1;//冷却施設のある町にチェックを入れる
		}
		cold[a] = cold[h] = 1;

		//道の構築
		for (int i = 0; i < k; i++)
		{
			int f, t, c;
			cin >> f >> t >> c;
			G[t].push_back(node{ f, c });
			G[f].push_back(node{ t, c });
		}
		

		//以下拡張ダイクストラ

		auto dist = make_v<int>(105, 105);
		//dist[i][j]:=町iに残り時間jを残して到着した時の最短時間

		fill_v(dist, INF);

		//(現在の時間，今いる頂点，残り時間)
		priority_queue<tiii, vector<tiii>, greater<tiii> > que;
		dist[a][m] = 0;
		que.push(tiii(0, a, m));
	
		while (!que.empty())
		{
			int tm, now, remain;
			tie(tm, now, remain) = que.top();
			que.pop();

			if (dist[now][remain] < tm) {
				continue;
			}

			if (cold[now]) {
				//今いる町に冷却施設がある
				for (auto itr: G[now]) {

					for (int j = 0; j <= m; j++)
					{
						//m分に回復するまで待つ
						if (remain > j) {
							//既にj分以上の余裕がある
							continue;
						}

						int wait = j - remain;//回復するまでの待ち時間
						if (j < itr.cost) {
							//次の町に行けない場合
							continue;
						}

	
						if (dist[now][remain] == INF) {
							continue;
						}

						//今の時間+回復までの待ち時間+移動コストのほうが小さい場合は更新
						if (dist[itr.to][j - itr.cost] > dist[now][remain] + wait + itr.cost) {
							dist[itr.to][j - itr.cost] = dist[now][remain] + wait + itr.cost;
							que.push(tiii(dist[itr.to][j - itr.cost], itr.to, j - itr.cost));
						}


					}
				}
			}
			else
			{
				//冷却施設がない
				for (auto itr : G[now]) {
					
					
					if (remain < itr.cost) {
						//移動できない
						continue;
					}

					if (dist[itr.to][remain - itr.cost] > dist[now][remain] + itr.cost) {
						dist[itr.to][remain - itr.cost] = dist[now][remain] + itr.cost;
						que.push(tiii(dist[itr.to][remain - itr.cost], itr.to, remain - itr.cost));
					}
				}
			}
		}	

		int ans = INF;
		for (int i = 0; i <= m; i++)
		{
			ans = min(ans, dist[h][i]);
		}

		if (ans == INF) {
			cout << "Help!" << endl;
		}
		else
		{
			cout << ans << endl;
		}

		dist.shrink_to_fit();
		G.shrink_to_fit();

	}




	return 0;

}



Measured memory_bytes: 3476