Problem: Princess in Danger

Princess crisis

English text is not available in this practice contest.

A brave princess in a poor country's tomboy is married to another country for a political marriage. However, a villain who was trying to kill the princess attacked him on the way to his wife, and the princess was seriously injured and was taken to a nearby hospital. However, the villain used a special poison to make sure the princess was dead. Therefore, in order to help the princess, she had to hurry to bring special medicine and frozen relatives' blood from her home country.

This blood is transported frozen, but must be re-frozen in a blood freezing facility within up to M minutes of the previous freezing to keep it fresh. However, there are only a few places where refrigeration facilities are installed.

Blood is safe for M minutes from a fully frozen state without refreezing. If the remaining time without refrigeration is S minutes and the product is transported without freezing for T minutes, the remaining time without refrigeration is S-T minutes. The remaining time that does not require refreezing can be restored up to M minutes by refreezing. The time it takes to refreeze blood depends on how much it is frozen. Every minute the blood is frozen in a freezing facility, the remaining time that does not need to be re-frozen recovers by 1 minute.

At the time of departure from the capital of the home country, the remaining time without refrigerating the blood is M minutes.

As a princess's servant, you must calculate the route to keep the blood fresh from the capital of your home country to the hospital where the princess was transported, in order to save the life of your precious lord. Yes, your mission is to figure out the shortest route from your home capital to the hospital and find the shortest time.

Input

The input consists of multiple datasets. The first row of each dataset contains six non-negative integers N (2 ≤ N ≤ 100), M (1 ≤ M ≤ 100), L (0 ≤ L ≤ N-2), K, A (0 ≤). A <N) and H (0 ≤ H <N) are given. These are the number of towns, the time limit for refrigeration, the number of towns with freezing facilities, the number of roads connecting towns directly, the number representing the capital of the home country, and the hospital where the princess was transported. Represents the town number. The capital of the home country and the hospital where the princess was transported are different towns. It is assumed that the towns are assigned numbers from 0 to N-1. The following lines are given L non-negative integers separated by a single space. These represent the numbers of the towns where the freezing facilities are located. The capital of the home country and the hospital where the princess was transported are not included in this list, but it can be considered that there is a freezing facility. The following line K gives information on the roads connecting the towns. In the i-th line, three non-negative integers X, Y, and T are given separated by one space, which means that there is a direct connection between town X and town Y, and it takes time T to move. Represents that. This road is bidirectional. Also, there is at most one road that directly connects town X and town Y.

The input ends when N = M = L = K = A = H = 0, which is not included in the dataset.

Output

For each dataset, output the shortest time that blood can be delivered while maintaining its freshness. If it cannot be delivered, output "Help!".

Sample Input


2 1 0 1 0 1
0 1 2
3 1 1 2 0 1
2
0 2 1
1 2 1
3 2 1 2 0 1
2
0 2 1
1 2 1
4 4 1 4 1 3
2
0 1 2
1 2 4
0 2 1
3 0 3
5 3 2 6 0 3
1 2
2 1 2
1 0 1
3 4 1
2 4 1
4 1 2
2 0 2
5 4 2 6 0 3
1 2
4 2 4
2 1 2
4 3 1
0 1 5
1 4 2
2 0 3
0 0 0 0 0 0


Output for the Sample Input


Help!
3
2
Ten
Five
12






Example

Input

2 1 0 1 0 1
0 1 2
3 1 1 2 0 1
2
0 2 1
1 2 1
3 2 1 2 0 1
2
0 2 1
1 2 1
4 4 1 4 1 3
2
0 1 2
1 2 4
0 2 1
3 0 3
5 3 2 6 0 3
1 2
2 1 2
1 0 1
3 4 1
2 4 1
4 1 2
2 0 2
5 4 2 6 0 3
1 2
4 2 4
2 1 2
4 3 1
0 1 5
1 4 2
2 0 3
0 0 0 0 0 0


Output

Help!
3
2
10
5
12

Solution (in JAVA):

Solution:

import static java.lang.System.in;
import static java.lang.System.out;
import static java.lang.Math.*;

import java.util.*;


public class Main {

	public static Scanner sc=new Scanner(in);

	static class Node{
		int id;
		int fp;
		boolean isC;
		List<Edge> link=new ArrayList<Edge>();

		Node(int _id,int _fp,boolean _isC){
			id=_id;
			fp=_fp;
			isC=_isC;
		}
	}

	static class Edge{
		Node f,t;
		int cost;
		Edge(Node _f,Node _t,int _cost){
			f=_f;t=_t;cost=_cost;
		}
	}

	static class Task implements Comparable<Task>{
		Node node;
		int time;
		Task(Node _node,int _time){
			node=_node;time=_time;
		}
		public int compareTo(Task arg0){
			return time-arg0.time;
		}
	}

	public static int[][] dijkstra(Node[][] graph,int s){
		int n=graph.length,M=graph[0].length-1;
		PriorityQueue<Task> que=new PriorityQueue<Task>();
		int[][] d=new int[n][M+1];
		for(int i=0;i<n;i++)
			Arrays.fill(d[i],1<<30);
		que.offer(new Task(graph[s][M],0));
		d[s][M]=0;
		while(!que.isEmpty()){
			Task di=que.poll();
			if(d[di.node.id][di.node.fp]<di.time)continue;
			for(Edge edge:di.node.link){
				if(d[edge.t.id][edge.t.fp]>d[di.node.id][di.node.fp]+edge.cost){
					d[edge.t.id][edge.t.fp]=d[di.node.id][di.node.fp]+edge.cost;
					que.offer(new Task(edge.t,d[di.node.id][di.node.fp]));

					//prev[edge.to]=di.id;
				}
			}
		}
		return d;
	}

	public void run(){
		while(true){
			int n=sc.nextInt(),m=sc.nextInt(),l=sc.nextInt(),
					k=sc.nextInt(),s=sc.nextInt(),e=sc.nextInt();
			if(n==0)return;

			boolean[] ccity=new boolean[n];
			for(int i=0;i<l;i++){
				int v=sc.nextInt();
				ccity[v]=true;
			}
			ccity[s]=ccity[e]=true;

			long[][] d=new long[n][n];

			for(int i=0;i<n;i++){
				Arrays.fill(d[i],1<<30);
				d[i][i]=0;
			}
			for(int i=0;i<k;i++){
				int x=sc.nextInt(),y=sc.nextInt(),t=sc.nextInt();
				d[x][y]=d[y][x]=t;
			}
		    for(int _k=0;_k<n;_k++)
		    	for(int i=0;i<n;i++)for(int j=0;j<n;j++)
		    		d[i][j] = min(d[i][j], d[i][_k] + d[_k][j]);

		    for(int i=0;i<n;i++)for(int j=0;j<n;j++){
		    	if(d[i][j]>m || !ccity[i] || !ccity[j])d[i][j]=1<<30;
		    }

		    for(int _k=0;_k<n;_k++)
		    	for(int i=0;i<n;i++)for(int j=0;j<n;j++)
		    		d[i][j] = min(d[i][j], d[i][_k] + d[_k][j]);

			if(d[s][e]==1<<30)
				ln("Help!");
			else{
				ln(d[s][e]+max(0,d[s][e]-m));
			}
		}

	}

	public static void main(String[] args) {
		new Main().run();
	}

	//output lib
	public static void ln(){
		out.println();
	}
	public static void pr(Object obj){
		out.print(str(obj));
	}
	public static void ln(Object obj){
		pr(obj);ln();
	}
	public static String str(Object obj){
		return obj.toString();
	}
	public static <E> String str(E[] obj){
		StringBuilder sb=new StringBuilder();
		for(int i=0;i<obj.length;i++){
			sb.append(i==0?"":" ").append(obj[i]);
		}
		return sb.toString();
	}
	public static <E> String str(List<E> obj){
		StringBuilder sb=new StringBuilder();
		for(int i=0;i<obj.size();i++){
			sb.append(i==0?"":" ").append(obj.get(i));
		}
		return sb.toString();
	}


}