#include <iostream>
#include <vector>
#include <queue>
using namespace std;
const int INF = 1<<29;
//struct from_to{int from,to;};
struct state{
  int cost,pos,rest;
  state(int c,int p,int r):cost(c),pos(p),rest(r){}
  bool operator>(const state &a) const{
    return cost > a.cost;
  }
};
//bool operator>(const state &a,const state &b){return a.cost > b.cost}
int dijkstra(vector<vector<int> > &dp,vector<int> &rest_pos,vector<vector<pair<int,int> > > &edge,int s,int m,int g){
  dp[s][m] = 0;
  priority_queue<state, vector<state > , greater<state > > que;
  que.push(state(0,s,m));
  while(!que.empty()){
    state c = que.top();que.pop();
    int pos = c.pos;
    int cost = c.cost;
    int rest = c.rest;
    if(dp[pos][rest] < cost)continue;
    if(pos == g)return cost;
    if(rest_pos[pos]){
      if(rest+1 <= m && dp[pos][rest+1] > cost+1){
	dp[pos][rest+1] = cost + 1;
	que.push(state(cost+1,pos,rest+1));
      }
    }
    for(int i = 0;i < edge[pos].size();i++){
      int next = edge[pos][i].first;
      int time = edge[pos][i].second;
      if(rest - time >= 0&&dp[next][rest-time] > cost+time){
	dp[next][rest-time] = cost + time;
	que.push(state(cost+time,next,rest-time));
      }
    }
  }
  return INF;
}
int main(){
  int n,m,l,k,a,h;
  while(cin >> n >> m >> l >> k >> a >> h, n | m | l | k | a | h){
    vector<vector<int> > dp(n,vector<int>(m+1,INF));
    vector<int> rest(n,0);
    for(int i = 0;i < l;i++){
      int tmp;
      cin >> tmp;
      rest[tmp] = 1;
    }
    vector<vector<pair<int,int> > > edge(n);
    for(int i = 0;i < k;i++){
      int f,t,time;
      cin >> f >> t >> time;
      edge[f].push_back(make_pair(t,time));
      edge[t].push_back(make_pair(f,time));
    }
    int tmp = dijkstra(dp,rest,edge,a,m,h);
    if(tmp == INF)cout << "Help!" << endl;
    else cout << tmp << endl;
  }
  return 0;
}