#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 T1[100000], T2[100000], D[100000]; int roadsc[10001]; int roadss[10001]; int roaddest[200000]; int roadtime[200000]; int attacked[10000]; bool visited[10000]; struct comp { bool operator () (pair p1, pair p2) { return (p1.first > p2.first); } }; int main() { while (1) { int N, M, A, K; scanf("%d%d%d%d", &N, &M, &A, &K); if (!N && !M && !A && !K) break; int roadc = 0; FOR(i, 0, M) { int t1, t2, d; scanf("%d%d%d", &t1, &t2, &d); T1[roadc] = t1-1; T2[roadc] = t2-1; D[roadc] = d; ++roadc; } FOR(i, 0, N) roadsc[i] = 0; FOR(i, 0, M) { ++roadsc[T1[i]]; ++roadsc[T2[i]]; } int total = roadsc[0]; roadsc[0] = 0; FOR(i, 1, N+1) { int t = roadsc[i]; roadsc[i] = total; total += t; } FOR(i, 0, N+1) roadss[i] = roadsc[i]; FOR(i, 0, M) { int from = T1[i], to = T2[i], time = D[i]; roaddest[roadsc[from]] = to; roadtime[roadsc[from]] = time; ++roadsc[from]; roaddest[roadsc[to]] = from; roadtime[roadsc[to]] = time; ++roadsc[to]; } FOR(i, 0, A) { FOR(j, 0, N) visited[j] = false; scanf("%d", &attacked[i]); --attacked[i]; priority_queue, vector >, greater > > to_visit; FOR(j, 0, i+1) { to_visit.push(make_pair(0, attacked[j])); } int unsafe = 0; while (to_visit.size()) { pair p = to_visit.top(); to_visit.pop(); int now = p.first; int at = p.second; //printf("%d %d\n", now, at); if (visited[at]) continue; if (now >= K) break; ++unsafe; visited[at] = true; FOR(j, roadss[at], roadss[at+1]) { int next = roaddest[j]; int nexttime = now+roadtime[j]; if (visited[next]) continue; to_visit.push(make_pair(nexttime, next)); } } printf("%d\n", N-unsafe); } printf("\n"); } return 0; }