import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.LinkedList;



class Dist {
	int t;
	Dist(int t, int d) {
		this.t = t;
		this.d = d;
	}
	int d;
}

class Edge {
	int v1, v2;
	int d;

	public Edge(int v1, int v2, int d) {
		super();
		this.v1 = v1;
		this.v2 = v2;
		this.d = d;
	}
	
}

public class invasion {
	
	static String readLine(BufferedReader in) throws IOException {
		String s = "";
		while (s.trim().length() == 0) {
			s = in.readLine();
		}
		return s;
	}
	
	static ArrayList< ArrayList<Edge> > M;
	
	static int getM(int i, int j) {
		for (int k=0; k<M.get(i).size(); k++) {
			Edge e = M.get(i).get(k);
			if (e.v2 == j) {
				return e.d;
			}
		}
		return 0;
	}
	
	static void setM(int i, int j, int d) {
		M.get(i).add(new Edge(i, j, d));
	}
	
	public static void main(String[] args) throws Exception
	{
		BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
		
		while(true)
		{
			String s = readLine(in);
			String[] xxx = s.split(" ");
			
			int n = Integer.valueOf(xxx[0]);
			int m = Integer.valueOf(xxx[1]);
			int a = Integer.valueOf(xxx[2]);
			int k = Integer.valueOf(xxx[3]);
			if (n == 0) break;
			
			M = new ArrayList<ArrayList<Edge>>();
			
			for (int i=0; i<n; i++) {
				M.add(new ArrayList<Edge>());
			}
			
			
			int t1, t2, d;

			//int M[][] = new int[n][n];
			boolean b[] = new boolean[n];
			int remain = n;
			
			for (int i=0; i<n; i++) {
				b[i] = true;
			}
			
			for (int i=0; i<m; i++) {				
				s = readLine(in);
				xxx = s.split(" ");
				t1 = Integer.parseInt(xxx[0]) - 1;
				t2 = Integer.parseInt(xxx[1]) - 1;
				d = Integer.parseInt(xxx[2]);
				
				setM(t1, t2, d);
				setM(t2, t1, d);
			}
			
			LinkedList<Dist> q = new LinkedList<Dist>();
			
			for (int i=0; i<a; i++) {
				s = readLine(in);
				int t = Integer.parseInt(s) - 1;
				
				int B[] = new int[n];
				for (int j = 0; j < n; j++) B[j] = Integer.MAX_VALUE;
				
				q.addLast(new Dist(t, 0));
				B[t] = 0;
				
				while (!q.isEmpty()) {
					Dist dist = q.removeFirst();
					t = dist.t;

					if (b[t]) remain--;
					b[t] = false;
					
					for (int j=0; j<n; j++) {
						int dd = getM(t,j); 
						if (dd > 0) {
							d = dist.d + dd;
							if (d < k && d < B[j]) {
								q.addLast(new Dist(j, d));
								B[j] = d;
							}
						}
					}
				}
				
				System.out.println(remain);
			}
			
			System.out.println();
		}
	}

}
