#include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; #define FOR(i,a,b) for (int i = (a); i < (b); ++i) #define FOR2(i,a,b) for (int i = (a); i > (b); ++i) #define DEBUG(x) cout << '>' << #x << ':' << x << endl; inline bool EQ(double a, double b) { return fabs(a-b) < 1e-9; } const int INF = 1<<29; typedef long long ll; ////////////////////////////////////////////////////////////////////////////// int N, M, A, K, res; const int MAX = 10047; vector > graph[MAX]; int pos[MAX]; int best[MAX]; void go(int n) { priority_queue, vector >, greater > > manage; if (best[n] > K) --res; best[n] = 0; manage.push(make_pair(0, n)); while (!manage.empty()) { pair temp = manage.top(); manage.pop(); n = manage.second; int cost = manage.first; if (best[n] < cost) continue; FOR(i, 0, graph[n].size()) { int next = graph[n][i].first, cost2 = graph[n][i].second+cost; if (best[next] > cost2) { if (best[next] > K && cost2 <= K) --res; best[next] = cost2; manage.push(make_pair(cost2, next)); } } } } int main() { while (1) { scanf("%d%d%d%d", &N, &M, &A, &K); if (!N && !M && !A && !K) break; FOR(i, 0, N) graph[i].clear(); FOR(i, 0, M) { int a, b, c; scanf("%d%d%d", &a, &b, &c); --a, --b; graph[a].push_back(make_pair(b,c)); graph[b].push_back(make_pair(a,c)); } FOR(i, 0, A) { scanf("%d", &pos[i]); --pos[i]; } res = N; FOR(i, 0, N) best[i] = INF; FOR(step, 0, A) { go(pos[i]); printf("%d\n", res); } printf("\n"); } return 0; }