//05
#include<iostream>
#include<queue>
#include<vector>

using namespace std;

struct S{
  int t,n,r;
  bool operator<(S a)const{
    return t>a.t;
  }
};

struct E{
  int t,c;
};

int main(){
  for(int n,m,l,k,a,h;cin>>n>>m>>l>>k>>a>>h,n|m|l|k|a|h;){
    bool cl[100]={};
    for(int i=0;i<l;i++){
      int t;
      cin>>t;
      cl[t]=true;
    }
    vector<int> to[100];
    vector<int> cs[100];
    for(int i=0;i<k;i++){
      int x,y,t;
      cin>>x>>y>>t;
      to[x].push_back(y);
      cs[x].push_back(t);
      to[y].push_back(x);
      cs[y].push_back(t);
    }
    priority_queue<S> que;
    S is={0,a,m};
    que.push(is);
    bool p[100][101]={{}};
    while(!que.empty()){
      S c=que.top();
      if(c.n==h)break;
      que.pop();
      if(p[c.n][c.r]++)continue;
      for(int i=0;i<to[c.n].size();i++){
	if(c.r>=cs[c.n][i]){
	  S n={c.t+cs[c.n][i],to[c.n][i],c.r-cs[c.n][i]};
	  que.push(n);
	}
      }
      if(cl[c.n]&&c.r<m){
	S n=c;
	n.r++;
	n.t++;
	que.push(n);
      }
    }
    if(que.empty()){
      cout<<"Help!"<<endl;
    }else{
      cout<<que.top().t<<endl;
    }
  }
  return 0;
}