#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#define F first
#define S second
using namespace std;
typedef pair<int,pair<int,int> > P;
struct edge{
  int t,c;
  edge(int t,int c):t(t),c(c){}
};
vector<edge> e[111];
bool c[111];

int n,m,l,k,a,h; 

int d[111][111];
int main(void){
  while(cin >> n >> m >> l >> k >> a >> h){
    if(!n) break;
    memset(c,false,sizeof(c));
    for(int i = 0; i < 111; i++) e[i].clear();
    for(int i = 0; i < l; i++){
      int b;
      cin >> b;
      c[b] = true;
    }
    for(int i = 0; i < k; i++){
      int x,y,t;
      cin >> x >> y >> t;
      e[x].push_back(edge(y,t));
      e[y].push_back(edge(x,t));
    }

    for(int i = 0; i < 111; i++){
      fill(d[i],d[i]+111,1<<28);
      d[i][a] = 0;
    }

    //d[解けるまでの時間][今いる場所]
    priority_queue<P,vector<P>,greater<P> > que;
    que.push(P(0,make_pair(m,a)));
    while(!que.empty()){
      P p = que.top(); que.pop();
      if(d[p.S.F][p.S.S] < p.F) continue;
      for(int j = 0; p.S.F + j <= m; j++){
	if(j && !c[p.S.S]) continue;
	for(int i = 0; i < (int)e[p.S.S].size(); i++){
	  edge v = e[p.S.S][i];
	  if(p.S.F - v.c + j >= 0 && d[p.S.F - v.c + j][v.t] > p.F + v.c + j){
	    d[p.S.F - v.c + j][v.t] = p.F + v.c + j;
	    que.push(P(p.F + v.c + j,make_pair(p.S.F - v.c + j,v.t)));
	  }
	}
      }
    }

    int res = 1<<28;
    for(int i = 0; i <= m; i++){
      res = min(res,d[i][h]);
    }
    if(res == 1<<28) cout << "Help!" << endl;
    else cout << res << endl;
  }
}