#include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; using ll=long long; #include using mint=atcoder::modint998244353; ostream& operator<<(ostream& os,const mint& x){ os<>(istream& is,mint& x){ int t; is>>t; x=t; return is; } template ostream& operator<<(ostream& os,const pair& p); template istream& operator>>(istream& is,pair& p); template ostream& operator<<(ostream& os,const array& arr); template istream& operator>>(istream& is,array& arr); template ostream& operator<<(ostream& os,const vector& vec); template istream& operator>>(istream& is,vector& vec); template ostream& operator<<(ostream& os,const pair& p){ os< istream& operator>>(istream& is,pair& p){ is>>p.first>>p.second; return is; } template ostream& operator<<(ostream& os,const array& arr){ for(int i=0;i istream& operator>>(istream& is,array& arr){ for(int i=0;i>arr[i]; return is; } template ostream& operator<<(ostream& os,const vector& vec){ for(int i=0;i<(int)vec.size();i++)os< istream& operator>>(istream& is,vector& vec){ for(int i=0;i<(int)vec.size();i++)is>>vec[i]; return is; } template void input_vec(Vecs&... vs) { const auto n = get<0>(tie(vs...)).size(); for (size_t i = 0; i < n; ++i) ((cin >> vs[i]), ...); } template void output_vec(const Vecs&... vs) { const auto n = get<0>(tie(vs...)).size(); for (size_t i = 0; i < n; ++i) { bool first = true; (((cout << (exchange(first, false) ? "" : " ") << vs[i])), ...); cout << endl; } } template vector make_unique(vector vec){ ranges::sort(vec); vec.erase(unique(vec.begin(),vec.end()),vec.end()); return vec; } template pair,vector> make_rank(const vector& vec, Comp comp = {}, Proj proj = {}) { int n = vec.size(); vector argsort(n); iota(argsort.begin(), argsort.end(), 0); ranges::stable_sort(argsort, comp, [&](int i) -> decltype(auto) { return invoke(proj, vec[i]); }); vector rank(n); for(int i=0;i; using vvl=vector>; using vvvl=vector>>; using vi=vector; using vvi=vector>; using vvvi=vector>>; vector dijkstra(vector>> graph,vl a,vl b,vl c,int s=0){ ll inf=1e18; int n=graph.size(); vector dist(n,inf); dist[s]=0; priority_queue> pq; pq.push(make_pair(0,s)); while(!pq.empty()){ auto[d,x]=pq.top(); d=-d; pq.pop(); if(d!=dist[x])continue; for(auto[w,y]:graph[x]){ ll nxt=(d+a[x]-1)/a[x]*a[x]; if(nxt==0)nxt=a[x]; if((nxt/a[x])%b[x]==0)nxt=min(nxt+c[x],nxt+a[x]); if(nxt+w>n>>m; using P=pair; vector> graph(n); for(int i=0;i>u>>v>>w; u--;v--; graph[u].push_back(P{w,v}); graph[v].push_back(P{w,u}); } vl a(n),b(n),c(n); cin>>a>>b>>c; auto dist=dijkstra(graph,a,b,c); cout<