#include #include #include #include #include #include #include #include #include using namespace std; int n, m, a, dsafe, t1, t2, t3; int safecnt; bool danger[10042]; vector< pair > edges[10042]; set visited; priority_queue< pair > q; int main() { scanf("%d %d %d %d", &n, &m, &a, &dsafe); while (n) { for (int i = 0; i < n; ++i) { edges[i].clear(); danger[i] = false; } safecnt = n; for (int i = 0; i < m; ++i) { scanf("%d %d %d", &t1, &t2, &t3); --t1; --t2; edges[t1].push_back(make_pair(t2, t3)); edges[t2].push_back(make_pair(t1, t3)); } for (int i = 0; i < a; ++i) { scanf("%d", &t1); --t1; visited.clear(); while (!q.empty()) q.pop(); q.push(make_pair(dsafe, t1)); while (!q.empty()) { pair cur = q.top(); q.pop(); int v = cur.second, d = cur.first; visited.insert(v); if (!danger[v]) { //printf("%d is now in danger!\n", v); danger[v] = true; --safecnt; } for (vector< pair >::iterator it = edges[v].begin(); it != edges[v].end(); ++it) { if (d - it->second > 0 && visited.find(it->first) == visited.end()) { q.push(make_pair(d - it->second, it->first)); } } } printf("%d\n", safecnt); } printf("\n"); scanf("%d %d %d %d", &n, &m, &a, &dsafe); } }