import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.StringWriter;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;


public class invasion {

	/**
	 * @param args
	 * @throws IOException 
	 */
	public static void main(String[] args) throws IOException {
		//System.out.println((int) '0');
		StringWriter writer = new StringWriter();
		BufferedReader bfr = new BufferedReader(new InputStreamReader(System.in));
		String line = bfr.readLine();
		StringTokenizer tokenizer;
		while(!line.equals("0 0 0 0")) {		
			tokenizer = new StringTokenizer(line);
			// Zpracovani prvni radky
				int size = Integer.parseInt(tokenizer.nextToken());
				int hran = Integer.parseInt(tokenizer.nextToken());
				int cities = Integer.parseInt(tokenizer.nextToken());
				int minPrice = Integer.parseInt(tokenizer.nextToken());
				
			Graph g = new Graph(size);
				
			// Cesty
			for(int i = 0; i< hran; i++)
			{
				line = bfr.readLine();
				tokenizer = new StringTokenizer(line);
				g.addPath(Integer.parseInt(tokenizer.nextToken()), Integer.parseInt(tokenizer.nextToken()), Integer.parseInt(tokenizer.nextToken()));
			}
			
			// Mesta
			for(int i = 0; i<cities; i++)
				writer.append(g.BFS(Integer.parseInt(bfr.readLine()), minPrice)+"\n");
			
			writer.append("\n");
			
			bfr.readLine();
			line = bfr.readLine();
		}
		System.out.print(writer);		
	}
}

class Graph {
	int [][] matrix;
	Vrchol [] vrcholy;
	
	public Graph(int size)
	{
		size++;
		matrix = new int[size][size];
		vrcholy = new Vrchol[size];
		for(int i = 0; i < size; i++)
			vrcholy[i] = new Vrchol(i);
	}
	
	public void addPath(int from, int to, int weight)
	{
		matrix[from][to] = weight;
		matrix[to][from] = weight;

	}
	
	public int BFS(int start, int minPrice)
	{
		for(int i = 0; i< matrix.length; i++)
			vrcholy[i].discover = false;
		
		int ret = 0;
		Queue fr = new LinkedList<Integer>();
		vrcholy[start].cenaDo = 0;
		vrcholy[start].discover = true;
		fr.add(start);
		while(!fr.isEmpty())
		{
			int vrchol = (Integer) fr.poll();
			for(int i = 0; i < matrix.length; i++)
			{
				if(matrix[vrchol][i] > 0 && !vrcholy[i].discover)
				{
					fr.add(i);
					int cena = 0;
					if(!vrcholy[i].vadny)
					{
						cena = vrcholy[vrchol].cenaDo + matrix[vrchol][i];
					}
					vrcholy[i].cenaDo = cena;
					if(vrcholy[i].cenaDo >= minPrice) ret++;
					vrcholy[i].discover = true;
				}
			}
		}
		vrcholy[start].vadny = true;
		return ret;
	}
	
	private class Vrchol
	{
		int index = -1;
		int pred = -1;
		int cenaDo = -1;
		boolean discover = false;
		boolean vadny = false;
		
		public Vrchol(int index){
			this.index = index;
		}
	}
	/* 7 6 3 3
1 2 1
1 3 1
2 5 1
3 6 1
1 4 1
4 7 2 */
}