#include <bits/stdc++.h>
#define int long long
using namespace std;
deque<pair<int, int>> dq;
vector<int> ans;
vector<pair<int, int>> mes;
vector<vector<pair<int, int>>> g;
int sum;
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=dq.size()-2;
while(l < r) {
int mid = (l+r)/2;
if(val > calc(dq[mid], dq[mid+1])) l = mid+1;
else r = mid;
}
if(val > calc(dq[l], dq[l+1])) l++;
return val*dq[l].first + dq[l].second;
}
void dfs(int no, int rt, int dis) {
stack<pair<int, int>> rem, upd;
if(rt != -1) {
ans[no] = mes[no].first * dis + mes[no].second;
if(dq.size() != 0) ans[no] = min(ans[no], query(mes[no].first) + dis*mes[no].first + mes[no].second);
pair<int, int> l = {-dis, ans[no]};
while(dq.size() > 1 && calc(dq[dq.size()-2], dq.back()) >= calc(dq.back(), l)) {
rem.push(dq.back());
dq.pop_back();
}
upd.push(l);
dq.push_back(l);
}
for(auto i: g[no]) {
if(i.first == rt) continue;
dfs(i.first, no, dis+i.second);
}
while(!upd.empty()) {
dq.pop_back();
upd.pop();
}
while(!rem.empty()) {
dq.push_back(rem.top());
rem.pop();
}
}
signed main() {
cin.tie(0)->sync_with_stdio(0);
int n;
cin >> n;
mes.assign(n+2, {0, 0});
ans.assign(n+2, 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;
}
dfs(1, -1, 0);
for(int i=2; i<=n; i++) {
cout << ans[i] << " ";
}
}