#include #include #include using namespace std; using ll = long long; //Edge struct Edge{ int to; long long cost; }; //Dijkstra class dijkstra{ public: vector> Graph; vector distances; vector prev; int nn; dijkstra(int n) : Graph(n), distances(n,1LL<<62), nn(n),prev(n,-1) {} bool add_edge(int from, int to, long long cost){ Graph.at(from).push_back({to,cost}); return true; } bool clear(){ for(int i=0;i; priority_queue,greater> q; distances.at(start)=0; q.push({0, start}); while(q.size()>0){ long long dist = q.top().first; int from = q.top().second; q.pop(); if(dist > distances.at(from))continue; for(auto & edge:Graph.at(from)){ long long d=distances.at(from)+edge.cost; if(d < distances.at(edge.to)){ prev[edge.to]=from; q.push({distances.at(edge.to) = d,edge.to}); } } } return true; } long long get_dist(int i){ if(distances[i]==1LL<<62){ return -1; }else{ return distances[i]; } } vector rest(int s,int g){ vector ans; int now=g; while(now!=-1){ ans.push_back(now); now=prev[now]; } reverse(ans.begin(),ans.end()); return ans; } }; int main(){ int n,m,p; ll y; cin >> n >> m >> p >> y; dijkstra dij(n); for(int i=0;i> a >> b >> c; a--;b--; dij.add_edge(a,b,c); dij.add_edge(b,a,c); } dij.solve(0); ll ans=0; for(int i=0;i> d >> e; d--; if(dij.get_dist(d)==-1)continue; ans = max(ans,(y-dij.get_dist(d))/e); } cout << ans << endl; return 0; }