#include using namespace std; #define rep(i,a,b) for(ll i=a;i=b;i--) #define ll long long #define ull unsigned ll #define ld long double #define bl __int128_t #define fi first #define se second #define vel vector #define vvel vector #define pll pair #define vepll vector #define vvepll vector #define ves vector #define vem vector #define vvem vector #define pmm pair #define cleout(i) cout<using PQ=priority_queue,greater>; // 上 右 下 左 vector di={-1, 0, 1, 0}; vector dj={ 0, 1, 0,-1}; vector dx={ 0, 1, 0,-1}; vector dy={ 1, 0,-1, 0}; vector ddx={ 1, 1, 1, 0, -1, -1, -1, 0 }; vector ddy={ 1, 0, -1, -1, -1, 0, 1, 1 }; ll inf=1000000000000000000;//1e18 // LLONG_MAX mt19937_64 rng((ull)chrono::steady_clock::now().time_since_epoch().count()); void _solve(){ ll N,M; cin>>N>>M; vvepll G(N); rep(i,0,M){ ll x,y,z; cin>>x>>y>>z; x--; y--; G[x].push_back({z,y}); G[y].push_back({z,x}); } vel a(N),b(N),c(N); rep(i,0,N)cin>>a[i]; rep(i,0,N)cin>>b[i]; rep(i,0,N)cin>>c[i]; vel ans(N,inf); PQ pq; ans[0]=1; pq.push({1,0}); while(pq.size()){ ll now=pq.top().se; pq.pop(); for(auto [C,y]:G[now]){ auto find=[&](ll x,ll y){ return (x+y-1)/y*y; }; ll t=find(ans[now],a[now]); if(t/a[now]%b[now]==0){ t+=c[now]; } t+=C; if(ans[y]>t){ ans[y]=t; pq.push({ans[y],y}); } t=find(ans[now],a[now]); if(t/a[now]%b[now]==0){ t+=a[now]+C; }else{ t=find(t,a[now]*b[now])+c[now]+C; } if(ans[y]>t){ ans[y]=t; pq.push({ans[y],y}); } } } cout<>_; else _=1; rep(__,0,_){ _solve(); } }