#include<stdio.h>
#include<stdlib.h>
#define rep(i,n) for(int i=0;(i)<(n);(i)++)
#define min(x,y) ((x)<(y)?(x):(y))
#define N 10000000
#define INF 99999999
typedef struct{
    int pos;
    int rest;
}Data;
Data queue[N];
int head,num;
void enqueue(int pos,int rest){
    if(num<N){
        queue[(head+num)%N].pos=pos;
        queue[(head+num)%N].rest=rest;
        num++;
    }else{
        printf("エラー\n");
        exit(1);
    }
}
Data dequeue(int cost[110][110]){
    int idx=head;
    int min=cost[queue[head].pos][queue[head].rest];
    for(int i=head+1;i<head+num;i++){
        if(min>cost[queue[i%N].pos][queue[i%N].rest]){
            min=cost[queue[i%N].pos][queue[i%N].rest];
            idx=i%N;
        }
    }
    Data tmp=queue[head]; queue[head]=queue[idx]; queue[idx]=tmp;
    Data d={-1,-1};
    if(num>0){
        d=queue[head];
        head=(head+1)%N;
        num--;
    }
    return d;
}
int main(void){
    while(1){
        int n,m,l,k,a,h;
        scanf("%d%d%d%d%d%d",&n,&m,&l,&k,&a,&h);
        if(n==0) break;
        int cool[110]={0};
        int dist[110][110];
        int cost[110][110];
        rep(i,110) rep(j,110) dist[i][j]=0,cost[i][j]=INF;
        int x;
        rep(i,l) scanf("%d",&x),cool[x]=1;
        //rep(i,n) printf("%d ",cool[i]); puts("");
        rep(i,k){
            int a,b,t;
            scanf("%d%d%d",&a,&b,&t);
            dist[a][b]=dist[b][a]=t;
        }
        head=num=0;
        cost[a][m]=0;
        enqueue(a,m);
        while(1){
            Data tmp=dequeue(cost);
            int pos=tmp.pos,rest=tmp.rest;
            if(pos==h) continue;
            if(pos==-1) break;
            for(int i=0;i<n;i++){
                if(pos==i) continue;
                if(dist[pos][i]==0) continue;
                if(cool[pos]){
                    for(int j=0;j<=m;j++){
                        if(rest+j>m) break;
                        if(rest-dist[pos][i]+j<0) continue;
                        if(cost[i][rest-dist[pos][i]+j]>
                           cost[pos][rest]+dist[pos][i]+j){
                           cost[i][rest-dist[pos][i]+j]=
                            cost[pos][rest]+dist[pos][i]+j;
                            enqueue(i,rest-dist[pos][i]+j);
                        }
                    }
                }else{
                    if(rest-dist[pos][i]<0)continue;
                    if(cost[i][rest-dist[pos][i]]>
                       cost[pos][rest]+dist[pos][i]){
                        cost[i][rest-dist[pos][i]]=
                        cost[pos][rest]+dist[pos][i];
                        enqueue(i,rest-dist[pos][i]);
                    }
                }
            }
        }
        /*rep(i,n){
            rep(j,m+1){
                printf("%8d ",cost[i][j]);
            }puts("");
        }puts("");*/
        int ans=INF;
        rep(i,m+1) ans=min(ans,cost[h][i]);
        if(ans==INF) printf("Help!\n");
        else printf("%d\n",ans);
    }
}

