/*
Author: Nguyen Chi Thanh - High School for the Gifted - VNU.HCM (i2528)
*/
#include <bits/stdc++.h>
using namespace std;
/* START OF TEMPALTE */
// #define int long long
#define ll long long
#define ull unsigned long long
#define ld long double
#define pii pair<int, int>
#define pll pair<ll, ll>
#define fi first
#define se second
#define popcount __builtin_popcountll
#define all(x) (x).begin(), (x).end()
#define BIT(x, i) (((x) >> (i)) & 1)
#define MASK(x) (1ll << (x))
#define SZ(a) ((int32_t)a.size())
#define debug(a, l, r) {for (int _i = (l); _i <= (r); ++_i) cout << (a)[_i] << ' '; cout << '\n';}
template<class X, class Y>
bool minimize(X &x, const Y &y) {
if (x > y) {
x = y;
return true;
} else return false;
}
template<class X, class Y>
bool maximize(X &x, const Y &y) {
if (x < y) {
x = y;
return true;
} else return false;
}
/* END OF TEMPALTE */
const ll INF = (ll)1e18 + 5;
struct Line {
ll a, b;
Line(ll _a = 0, ll _b = INF) : a(_a), b(_b) {}
ll get(ll x) const { return a * x + b; }
};
struct RollbackCHT {
struct State {
int prev_max, prev_pos;
Line prev_line;
bool overwritten;
};
static ld intersect(const Line &l1, const Line &l2) {
return (ld)(l2.b - l1.b) / (ld)(l1.a - l2.a);
}
vector<Line> stk;
vector<State> history;
int stk_max;
RollbackCHT() {
stk.clear();
history.clear();
stk_max = 0;
}
int checkpoint() {
return SZ(history);
}
ll query(ll x) {
int l = 0, r = stk_max - 1;
while (l < r) {
int m = (l + r) >> 1;
if (intersect(stk[m], stk[m + 1]) < x) l = m + 1;
else r = m;
}
return stk[l].get(x);
}
int remove_pos(const Line &line) {
if (stk_max < 2 || intersect(line, stk[stk_max - 1]) >= intersect(stk[stk_max - 1], stk[stk_max - 2])) {
return stk_max;
}
int l = 1, r = stk_max - 1;
while (l < r) {
int m = (l + r) >> 1;
if (intersect(line, stk[m]) < intersect(stk[m], stk[m - 1])) r = m;
else l = m + 1;
}
return l;
}
void add_line(Line line) {
int pos = remove_pos(line);
State cur;
cur.prev_max = stk_max;
cur.prev_pos = pos;
cur.overwritten = (pos < SZ(stk));
if (cur.overwritten) cur.prev_line = stk[pos];
history.push_back(cur);
if (pos == stk_max) {
if (stk_max == SZ(stk)) stk.push_back(line);
else stk[stk_max] = line;
++stk_max;
} else {
stk[pos] = line;
stk_max = pos + 1;
}
}
void rollback(int snapshot) {
while (SZ(history) > snapshot) {
State cur = history.back();
history.pop_back();
if (cur.overwritten) stk[cur.prev_pos] = cur.prev_line;
stk_max = cur.prev_max;
}
}
};
const int MAXN = 1e5 + 5;
int n, s[MAXN], v[MAXN], parent[MAXN];
ll dp[MAXN], distToRoot[MAXN];
vector<pii> adj[MAXN];
RollbackCHT cht;
void init() {
cin >> n;
for (int i = 1; i < n; ++i) {
int u, v, w; cin >> u >> v >> w;
adj[u].push_back({v, w});
adj[v].push_back({u, w});
}
for (int i = 2; i <= n; ++i) {
cin >> s[i] >> v[i];
}
cht.add_line(Line(0, 0));
}
void dfsPrepare(int u, int par = 0) {
parent[u] = par;
for (auto &e : adj[u]) {
int v = e.fi, w = e.se;
if (v == par) continue;
distToRoot[v] = distToRoot[u] + w;
dfsPrepare(v, u);
}
}
void dfsDP(int u, int par = 0) {
int snapshot = cht.checkpoint();
if (u != 1) {
dp[u] = s[u] + 1ll * v[u] * distToRoot[u] + cht.query(v[u]);
cht.add_line(Line(-distToRoot[u], dp[u]));
}
for (auto &e : adj[u]) {
int v = e.fi;
if (v == par) continue;
dfsDP(v, u);
}
cht.rollback(snapshot);
}
void solve() {
dfsPrepare(1);
fill(dp + 1, dp + n + 1, INF);
dp[1] = 0;
dfsDP(1);
for (int i = 2; i <= n; ++i)
cout << dp[i] << ' ';
}
signed main() {
#ifdef NCTHANH
freopen("input.txt", "r", stdin);
freopen("output.txt", "w", stdout);
#endif
ios_base::sync_with_stdio(0);
cin.tie(nullptr); cout.tie(nullptr);
init();
solve();
return 0;
}