import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.Queue;


public class invasion {
	
	static class Dist {
		int t;
		public Dist(int t, int d) {
			super();
			this.t = t;
			this.d = d;
		}
		int d;
	}
	
	public static void main(String[] args) throws Exception
	{
		BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
		
		while(true)
		{
			String s = in.readLine();
			String[] xxx = s.split(" ");
			
			int n = Integer.parseInt(xxx[0]);
			int m = Integer.parseInt(xxx[1]);
			int a = Integer.parseInt(xxx[2]);
			int k = Integer.parseInt(xxx[3]);
			if (n == 0) break;
			
			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 = in.readLine();
				/*xxx = s.split(" ");
				t1 = Integer.parseInt(xxx[0]) - 1;
				t2 = Integer.parseInt(xxx[1]) - 1;
				d = Integer.parseInt(xxx[2]);
				
				M[t1][t2] = d;
				M[t2][t1] = d;*/
			}
			
			//LinkedList<Dist> q = new LinkedList<Dist>();
			
			for (int i=0; i<a; i++) {
				s = in.readLine();
				/*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++) {
						if (M[t][j] > 0) {
							d = dist.d + M[t][j];
							if (d < k && d < B[j]) {
								q.addLast(new Dist(j, d));
								B[j] = d;
							}
						}
					}
				}
				
				System.out.println(remain);*/
			}
			
			System.out.println("0");
			
			in.readLine();
			System.out.println();
		}
	}

}
