#include #include #include #include #include using namespace std; // 辺の情報を保持する構造体 struct Edge { int to; int cost; }; // ダイクストラ法の実装 int main() { int N, M, P, Y; cin >> N >> M >> P >> Y; vector> edge(N); // グラフの構築 for (int i = 0; i < M; ++i) { int a, b, c; cin >> a >> b >> c; --a; --b; edge[a].push_back({b, c}); edge[b].push_back({a, c}); } // 店舗情報の読み込み vector> shop(P); for (int i = 0; i < P; ++i) { int d, e; cin >> d >> e; shop[i] = {d - 1, e}; } // ダイクストラ法の準備 priority_queue> pq; // (所持金, 頂点) vector money_s(N, 0); pq.push({Y, 0}); // 初期状態 // ダイクストラ法 while (!pq.empty()) { int money = pq.top().first; int now = pq.top().second; pq.pop(); if (money <= money_s[now]) continue; money_s[now] = money; for (const auto& e : edge[now]) { int next = e.to; int cost = e.cost; if (money_s[next] < money - cost) { pq.push({money - cost, next}); } } } // 結果計算 int ans = numeric_limits::min(); for (const auto& s : shop) { int node = s.first; int rate = s.second; if (money_s[node] > 0) { ans = max(ans, money_s[node] / rate); } } cout << ans << endl; return 0; }