#include <bits/stdc++.h>
using namespace std;

//repetition
#define FOR(i,a,b) for(ll i=(a);i<(b);++i)
#define rep(i, n) for(ll i = 0; i < (ll)(n); i++)

//container util
#define all(x) (x).begin(),(x).end()

//typedef
typedef long long ll;
typedef vector<int> VI;
typedef vector<VI> VVI;
typedef vector<ll> VLL;
typedef vector<VLL> VVLL;
typedef vector<string> VS;
typedef pair<int, int> PII;
typedef pair<ll, ll> PLL;

//const value
//const ll MOD = 1e9 + 7;
//const int dx[] = {0,1,0,-1};//{0,0,1,1,1,-1,-1,-1};
//const int dy[] = {1,0,-1,0};//{1,-1,0,1,-1,0,1,-1};

//conversion
inline int toInt(string s) {int v; istringstream sin(s);sin>>v;return v;}
inline ll toLL(string s) {ll v; istringstream sin(s);sin>>v;return v;}
template<class T> inline string toString(T x) {ostringstream sout;sout<<x;return sout.str();}
const int INF = 1e9;

map<int,bool> hos;
int goal,M;
// first dist, second.first  lim, second.second nodeNum
typedef pair<ll,pair<ll,ll>> State;
struct edge{ll to; ll cost;};

struct graph{
  ll V;
  vector<vector<edge>> G;
  VVLL dp;

  graph(ll n){
    init(n);
  }

  void init(ll n){
    V = n;
    G.resize(V);
    dp.resize(V);
    rep(i, V){
      rep(j,M+1)
      dp[i].push_back(INF);
    }
  }

  void add_edge(ll s, ll t, ll cost){
    edge e;
    e.to = t, e.cost = cost;
    G[s].push_back(e);
  }

  void dijkstra(ll s){
    rep(i, V){
      rep(j,M+1){
        dp[i][j] = INF;
      }
    }

    dp[s][M] = 0;
    priority_queue<State, vector<State>, greater<State> > que;
    que.push(State(0,PLL(M,s)));

    while(!que.empty()){
      State st = que.top();
      que.pop();
      ll c_node = st.second.second;
      ll c_lim = st.second.first;
      ll c_dist = st.first;
      // cout << c_node << " " << c_lim << " " << c_dist << endl;
      if(dp[c_node][c_lim] < c_dist) continue;
      for(auto e: G[c_node]){
        if(hos[c_node] == false){
          if(c_lim - e.cost >= 0 && dp[e.to][c_lim - e.cost] > ( c_dist + e.cost ) ){
            dp[e.to][c_lim - e.cost] = c_dist + e.cost;
            que.push(State(c_dist + e.cost,PLL(c_lim - e.cost,e.to)));
          }
        }
        else {
          // cout << "if "<< M << " - " <<c_lim << " + " << 1 << endl;
          rep(i,M-c_lim+1){
            if(c_lim - e.cost + i >= 0 && dp[e.to][c_lim - e.cost + i] > ( c_dist + e.cost + i) ){
              dp[e.to][c_lim - e.cost + i] = c_dist + e.cost + i;
              que.push(State(c_dist + e.cost + i,PLL(c_lim-e.cost+i,e.to)));
            }
          }
        }
      }
    }
  }
};

int main(){
  ios::sync_with_stdio(false);
  cin.tie(0);
  int n,m,l,k,a,h;

  while(true){
    cin >> n >> m >> l >> k >> a >> h;
    M = m;
    goal = h;
    // 0idx
    if(n==0 && m==0 && l==0 && k==0 && a==0 && h==0) break;
    int tmp;
    rep(i,l){
      cin >> tmp;
      hos[tmp] = true;
    }
    int x,y,cost;
    graph g(n);
    rep(i,k){
      cin >> x >> y >> cost;
      g.add_edge(x,y,cost);
      g.add_edge(y,x,cost);
    }

    g.dijkstra(a);
    ll ans = INF;
    rep(i,m+1) ans = min(g.dp[h][i] ,ans);
    if(ans != INF) cout <<  ans << endl;
    else cout << "Help!" << endl;
    hos.clear();
  }
  return 0;
}



Measured memory_bytes: 3580