#include <bits/stdc++.h>
#define int long long
using namespace std;
vector<int> ans;
vector<pair<int, int>> dq, mes;
vector<vector<pair<int, int>>> g;
int sum, sz;
double calc(pair<int, int> a, pair<int, int> b) {
return double(b.second-a.second)/double(a.first-b.first);
}
int query(int val) {
int l=0, r=sz-2;
while(l < r) {
int mid = (l+r)/2;
if(val > calc(dq[mid], dq[mid+1])) l = mid+1;
else r = mid;
}
while(l < sz-1 && calc(dq[l], dq[l+1]) < val) l++;
return val*dq[l].first + dq[l].second;
}
void dfs(int no, int rt, int dis) {
pair<int, int> reml;
int l=0, r=sz-2, osz = sz;
if(rt != -1) {
ans[no] = query(mes[no].first) + mes[no].first * dis + mes[no].second;
pair<int, int> line = {-dis, ans[no]};
while(l < r) {
int mid = (l+r)/2;
if(calc(dq[mid], dq[mid+1]) <= calc(dq[mid+1], line)) l = mid+1;
else r = mid;
}
while(l < sz-1 && calc(dq[l], dq[l+1]) <= calc(dq[l+1], line)) l++;
sz = l+2;
reml = dq[l+1];
dq[l+1] = line;
}
for(auto i: g[no]) {
if(i.first == rt) continue;
dfs(i.first, no, dis+i.second);
}
if(rt != -1) {
dq[l+1] = reml;
sz = osz;
}
}
signed main() {
cin.tie(0)->sync_with_stdio(0);
int n;
cin >> n;
mes.assign(n+2, {0, 0});
ans.assign(n+2, 0);
dq.assign(n+2, {0, 0});
g.assign(n+2, vector<pair<int, int>>());
for(int i=1; i<n; i++) {
int u, v, w;
cin >> u >> v >> w;
g[u].push_back({v, w});
g[v].push_back({u, w});
}
for(int i=2; i<=n; i++) {
cin >> mes[i].second >> mes[i].first;
}
sz = 1;
dfs(1, -1, 0);
for(int i=2; i<=n; i++) {
cout << ans[i] << " ";
}
}