//嘘ダイクストラ #include #include #include using namespace std; using namespace atcoder; using ll = long long; const ll INF = 2000000000000000000; ll N, M, P, Y; //dijkstra struct edge{ ll pre, to; ll cost; ll idx; }; vector> G; vector dijkstra(int start = 0) { int N = G.size(); vector dist(N, INF); using classPQ = tuple; priority_queue, greater> que; que.emplace(0, start, 0); dist[start] = 0; while(!que.empty()){ auto [d, c, p] = que.top(); que.pop(); if(dist[c] != d) continue; for(auto& e : G[c]){ //=を含むとTLEする if(d + e.cost <= dist[e.to]){ dist[e.to] = d + e.cost; que.emplace(dist[e.to], e.to, e.idx); } } } return dist; } int main(){ cin >> N >> M >> P >> Y; G.resize(N + 1); for(int i = 1; i <= M; i++){ ll a, b, c; cin >> a >> b >> c; G[a].push_back(edge{a, b, c, i}); G[b].push_back(edge{b, a, c, i}); } auto dist = dijkstra(1); ll ans = 0; for(int i = 1; i <= P; i++){ ll d, e; cin >> d >> e; if(dist[d] <= Y) ans = max(ans, (Y - dist[d]) / e); } cout << ans << endl; return 0; }