#define _GLIBCXX_DEBUG #include using namespace std; #define rep(i, n) for (int i = 0; i < (ll)(n); i++) #define all(a) (a).begin(), (a).end() using ll = long long; const int INF32 = 2e9; const ll INF64 = 4e18; int main() { // 入力. ll N, M, P, Y; cin >> N >> M >> P >> Y; vector A(N), B(N), C(N), E(N, INF64); vector>> G(N); for (int i = 0; i < M; i++) { cin >> A[i] >> B[i] >> C[i]; A[i]--; B[i]--; // 0-indexed. G[A[i]].push_back(make_pair(B[i], C[i])); G[B[i]].push_back(make_pair(A[i], C[i])); } for (int i = 0; i < P; i++) { ll Di, EDi; cin >> Di >> EDi; Di--;// 0-indexed. E[Di] = EDi; } // ダイクストラ法に必要な配列等. vector katsuage(N, INF64); vector confirmed(N, false); priority_queue, vector>, greater>> PQ; // 始点. katsuage[0] = 0; PQ.push(make_pair(katsuage[0], ll(0))); // ダイクストラ法. while (!PQ.empty()) { int pos = PQ.top().second; PQ.pop(); if (confirmed[pos]) continue; confirmed[pos] = true; for (int i = 0; i < G[pos].size(); i++) { int next = G[pos][i].first; int cost = G[pos][i].second; if (katsuage[next] > katsuage[pos] + cost) { katsuage[next] = katsuage[pos] + cost; PQ.push(make_pair(katsuage[next], ll(next))); } } } // ハチマキが何本買えるか. ll ans = 0; for (int i = 0; i < N; i++) { ans = max(ans, (Y-katsuage[i])/E[i]); } cout << ans << endl; return 0; }