#include #include #include int dist[10000][10000]; int safe[10000]; void check(int d, int base, const int lim, int cd, const int safedist) { if(d <= 0) return; if (cd >= safedist) return; //printf("In %d, dist %d, (%d)\n", base, cd, d); if (cd < safe[base] || safe[base] == -1) { safe[base] = cd; } for (int i = 0; i < lim; i++) { if (dist[base][i]) { //printf("Check base %d\n", i); check(d-dist[base][i], i, lim, cd+dist[base][i], safedist); } } } bool solve() { int N, M, A, K; scanf("%d %d %d %d\n", &N, &M, &A, &K); if (N == 0) return false; //int dist[10000][10000]; memset(dist, 0, sizeof(int)*10000*10000); //int safe[10000]; memset(safe, -1, sizeof(int)*10000); for (int i = 0; i < M; i++) { int a,b,c; scanf("%d %d %d\n", &a, &b, &c); a--; b--; dist[a][b] = c; dist[b][a] = c; } for (int i = 0; i < A; i++) { int a; scanf("%d\n", &a); a--; check(K, a, N, 0, K); int sum = N; for (int i = 0; i < N; i++) { //printf("safe %d\n",safe[i]); if (safe[i] != -1) sum--; } printf("%d\n", sum); } printf("\n"); return true; } int main (int, char**) { while (solve()); return EXIT_SUCCESS; }