import java.util.*; public class Dijkstra { static class Node implements Comparable { int index, time, freeze; boolean alreadyFreeze; Node(int index, int time, int freeze) { this.index = index; this.time = time; this.freeze = freeze; } Node(int index, int time,int freeze, boolean alreadyFreeze) { this(index,time,freeze); this.alreadyFreeze = alreadyFreeze; } public int compareTo(Node o) { return time - o.time; } } public static void main(String[] args) { Scanner sc = new Scanner(System.in); while(true) { int n = sc.nextInt(), m = sc.nextInt(), l = sc.nextInt(), K = sc.nextInt(), a = sc.nextInt(), h = sc.nextInt(); if(n == 0) break; int[][] AM = new int[n][n]; for(int i = 0; i < n; i++) { Arrays.fill(AM[i], 1 << 28); } boolean[] isfreezer = new boolean[n]; for(int i = 0; i < l; i++) isfreezer[sc.nextInt()] = true; for(int i = 0; i < K; i++) { int src = sc.nextInt(), des = sc.nextInt(), cost = sc.nextInt(); AM[src][des] = AM[des][src] = cost; } Queue queue = new PriorityQueue(); queue.add(new Node(a, 0, m)); int ans = 1 << 28; boolean[][] check = new boolean[m + 1][n]; while(!queue.isEmpty()) { Node node = queue.poll(); if(check[node.freeze][node.index]) continue; check[node.freeze][node.index] = true; if(node.index == h) { ans = node.time; break; } for(int i = 0; i < n; i++) { if(i == node.index) continue; if(AM[node.index][i] <= node.freeze && !check[node.freeze - AM[node.index][i]][i]) { queue.add(new Node(i, node.time + AM[node.index][i], node.freeze - AM[node.index][i])); } } if(isfreezer[node.index] && !node.alreadyFreeze) { for(int i = 1; i + node.freeze <= m; i++) { if(!check[i + node.freeze][node.index]) { queue.add(new Node(node.index, node.time + i, node.freeze + i, true)); } else break; } } } if(ans >= 1 << 28) { System.out.println("Help!"); } else { System.out.println(ans); } } } }