//#include "bits/stdc++.h"

#include <iostream>
#include <vector>
#include <map>
#include <queue>
// #include <string>
// #include <algorithm>
// #include <numeric>
// #include <limits>

using namespace std;

int n;
uint m;
int l;
int k;
int a; // start vid
int h; // goal vid

const int max_size = 100;
uint graph[max_size][max_size];
int exist[max_size]; // frozen center exist

void print() {
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < n; j++) {
			uint c = graph[i][j];
			if (c == (uint) -1) {
				cout << '-' << ' ';
				continue;
			}
			cout << c << ' ';
		}
		cout << endl;
	}
}

void clear() {
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < n; j++) {
			graph[i][j] = -1;
		}
	}
	for (int i = 0; i < n; i++) {
		exist[i] = false;
	}
}

void input() {
	exist[a] = true;
	exist[h] = true;
	for (int i = 0; i < l; i++) {
		int vid;
		cin >> vid;
		exist[vid] = true;
	}
	for (int i = 0; i < k; i++) {
		int x;
		int y;
		uint t;
		cin >> x >> y >> t;
		if (t > m) {
			continue;
		}
		graph[x][y] = t;
		graph[y][x] = t;
	}
}

bool isOverflow(uint a, uint b) {
	uint max = -1;
	return (a > max - b );
}

uint safePlus(uint a, uint b) {
	if (isOverflow(a, b)) {
		return -1;
	}
	return a + b;
}

void simplifyVertex(int vid) {
	for (int i = 0; i < n; i++) {
		if (graph[vid][i] == (uint) -1) {
			continue;
		}
		for (int j = i + 1; j < n; j++) {
			if (graph[vid][j] == (uint) -1) {
				continue;
			}
			uint cost = safePlus(graph[vid][i], graph[vid][j]);
			if (cost > m) {
				cost = -1;
			}
			cost = min(cost, graph[i][j]);
			graph[i][j] = graph[j][i] = cost;
		}
	}
	// maybe need not
	for (int i = 0; i < n; i++) {
		graph[i][vid] = graph[vid][i] = -1;
	}
}

void simplify() {
	for (int i = 0; i < n; i++) {
		if (exist[i]) {
			continue;
		}
		simplifyVertex(i);
	}
}

uint bfs() {
	bool visited[max_size];
	for (int i = 0; i < n; i++) {
		visited[i] = false;
	}
	multimap<uint, int> queue; // cost, vid
	queue.insert({0, a});
	while (queue.empty() == false) {
		auto node = begin(queue);
		uint cost = node->first;
		int vid = node->second;
		queue.erase(node);
		//std::cout << "debug vid,cost " << vid << " " << cost << std::endl; // debug
		if (visited[vid]) {
			// std::cout << "debug visited" << std::endl; // debug
			continue;
		}
		if (vid == h) {
			//std::cout << "debug here" << std::endl; // debug
			return cost;
		}
		visited[vid] = true;
		for (int to = 0; to < n; to++) {
			if (graph[vid][to] == (uint) -1 or visited[to]) {
				continue;
			}
			uint new_cost = safePlus(cost, graph[vid][to]);
			//std::cout << "debug insert " << to << " " << new_cost << std::endl; // debug
			queue.insert({new_cost, to});
		}
	}
	return -1;
}

void solve() {
	clear();
	input();
	// std::cout << "debug " << a << " " << h << std::endl; // debug
	//print(); cout << endl;
	simplify();
	//print(); cout << endl;
	uint move_time = bfs();
	if (move_time == (uint) -1) {
		cout << "Help!" << endl;
		return;
	}
	uint time;
	if (move_time < m) {
		time = move_time;
	} else {
		time = move_time + (move_time - m);
	}
	cout << time << endl;
}

int main() {

	while (true) {
		cin >> n >> m >> l >> k >> a >> h;
		if (n == 0) {
			break;
		}
		solve();
	}

	// std::cout << "\e[38;5;0m\e[48;5;40m --- end ---  \e[m" << std::endl; // debug
	return 0;
}

Measured memory_bytes: 3192