#include<iostream>
#include<vector>
#include<map>
#include<cassert>
#include<algorithm>
#include<deque>
#define F first
#define S second
#define pb push_back

using namespace std;
typedef pair<int,int> P;
typedef vector<int> VI;
typedef vector<VI> VVI;
typedef vector<P> VP;
typedef vector<VP> VVP;

class Pox
{
public:
  int p;
  int ST;
  int cost;
  Pox(int p = 0,int ST = 0,int cost = 0):p(p),ST(ST),cost(cost){}
};

int main()
{
  int N,M,L,K,A,H;
  while(cin >> N >> M >> L >> K >> A >> H,(N || M || L || K || A || H))
    {
      VVP G;
      G.resize(N);
      int mincost[N][M+1];
      bool hospital[N];
      for(int i=0;i<N;i++)
	hospital[i] = false;
      for(int i=0;i<N;i++)
	for(int j=0;j<=M;j++)
	  mincost[i][j] = (1<<28);

      for(int i=0;i<L;i++)
	{
	  int num;
	  cin >> num;
	  hospital[num] = true;
	}

      for(int i=0;i<K;i++)
	{
	  int X,Y,T;
	  cin >> X >> Y >> T;
	  G[X].push_back(P(Y,T));
	  G[Y].push_back(P(X,T));
	}

      deque<Pox> deq;
      deq.pb(Pox(A,M,0));
      mincost[A][M] = 0;
      int ans = (1<<28);

      while(!deq.empty())
	{
	  Pox pox = deq.front(); deq.pop_front();
	  int p = pox.p;
	  int ST = pox.ST;
	  int cost = pox.cost;

	  if(cost >= ans)
	    continue;	 

	  if(p == H)
	    {
	      ans = min(ans,cost);
	      continue;
	    }

	  for(int i=0;i<G[p].size();i++)
	    {
	      P np = G[p][i];
	      int nST = ST - np.S;
	      
	      if(nST < 0)
		continue;	      
	      
	      if(!hospital[np.F])
		{	
		  if(mincost[np.F][nST] > cost + np.S)
		    {
		      mincost[np.F][nST] = cost + np.S;
		      deq.push_back(Pox(np.F,nST,cost+np.S));
		    }

		}
	      else
		{

		  for(int j=0;j<=M-nST;j++)
		    {
		      assert(nST+j <= M);
		      if(mincost[np.F][nST+j] > cost + np.S + j)
			{
			  mincost[np.F][nST+j] = cost + np.S + j;
			  deq.pb(Pox(np.F,nST+j,cost+np.S+j));
			}	  
		    }
		  
		}

	    }

	}
      ans == (1<<28)?cout << "Help!" << endl:cout << ans << endl;
    }
  return 0;
}