#include<iostream>
#include<algorithm>
#include<vector>
#include<map>
#include<queue>
using namespace std;
typedef pair<int,int> Pt;
typedef pair<int,Pt> P;
#define fr first
#define sc second
#define INF 10000000
struct edge{
  int to,cost;
  edge(){}
  edge(int to,int cost):to(to),cost(cost){};
};
int N,M,L,K,A,H,d[100][101];
bool cool[100];
vector< vector<edge> > info;
void init();
int Dijkstra();
int main(){
  int n,m,a,b,c;
  while(cin >> N >> M >> L >> K >> A >> H && N){
    init();
    while(L--){
      cin >> a;
      cool[a] = true;
    }
    while(K--){
      cin >> a >> b >> c;
      info[a].push_back(edge(b,c));
      info[b].push_back(edge(a,c));
    }
    int ans = Dijkstra();
    if(ans == -1) cout << "Help!" << endl;
    else cout << ans << endl;
    info.clear();
  }
}
void init(){
  info.resize(N);
  for(int i=0;i<N;i++){
    for(int j=0;j<=M;j++) d[i][j] = INF;
    cool[i] = false;
  }
}
int Dijkstra(){
  priority_queue<P,vector<P>,greater<P> > que;
  d[A][M] = 0;
  que.push(P(0,Pt(A,M)));
  while(!que.empty()){
    P p = que.top();
    que.pop();
    int c = p.fr,now = p.sc.fr,lim = p.sc.sc;
    if(d[now][lim] < c) continue;
    if(now == H) return c;
    if(!cool[now]){
      for(int i=0;i<info[now].size();i++){
        edge e = info[now][i];
        if(lim - e.cost >= 0 && c + e.cost < d[e.to][lim - e.cost]){
          d[e.to][lim - e.cost] = c + e.cost;
          que.push(P(d[e.to][lim - e.cost],Pt(e.to,lim - e.cost)));
        }
      }
    }else{
      for(int i=0;i<info[now].size();i++){
        for(int j=lim,k=0;j<=M;j++,k++){
          edge e = info[now][i];
          if(j - e.cost >= 0 && c + e.cost + k < d[e.to][j - e.cost]){
            d[e.to][j - e.cost] = c + e.cost + k;
            que.push(P(d[e.to][j - e.cost],Pt(e.to,j - e.cost)));
          }
        }
      }
    }
  }
  return -1;
}