// Author: 4uckd3v - Nguyen Cao Duc
#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
typedef pair<int, int> ii;

const int MAX_N = 1e5;
const int MOD = 1e9 + 7;

struct Line {
    ll a, b;
    Line() {};
    Line(ll a, ll b) : a(a), b(b) {};

    ll eval(int x) { return a * x + b; };
    ll div(ll a, ll b) { return a / b - ((a ^ b) < 0 && a % b); };
    double intersect(const Line &other) {
        return (double)(other.b - b) / (a - other.a);
    };
};

struct State {
    int pos, size;
    Line overwrite;
    State(int pos, int size, Line overwrite) : pos(pos), size(size), overwrite(overwrite) {};
};

struct ConvexHullTrick {
    Line line[MAX_N + 5];
    int size;

    stack<State> st;

    void rollback() {
        assert(!st.empty());
        line[st.top().pos] = st.top().overwrite;
        size = st.top().size;
        st.pop();
    };

    void addLine(Line newLine) {
        if (size < 2) {
            st.push(State(size, size, line[size]));
            line[size++] = newLine;
            return;
        };

        int l = 0, r = size - 2, pos = size;
        while (l <= r) {
            int mid = (l + r) >> 1;
            if (line[mid].intersect(newLine) <= line[mid].intersect(line[mid + 1])) {
                pos = mid + 1;
                r = mid - 1;
            } else
                l = mid + 1;
        };

        st.push(State(pos, size, line[pos]));
        line[pos] = newLine;
        size = pos + 1;
    };

    ll query(int x) {
        if (size < 2) return line[0].eval(x);

        ll res = line[0].eval(x);
        int l = 0, r = size - 2;
        while (l <= r) {
            int mid = (l + r) >> 1;
            res = min(res, line[mid].eval(x));
            res = min(res, line[mid + 1].eval(x));
            if (line[mid].eval(x) >= line[mid + 1].eval(x))
                l = mid + 1;
            else
                r = mid - 1;
        };

        return res;
    };
};

int n;
int S[MAX_N + 5], V[MAX_N + 5];
ll dp[MAX_N + 5], f[MAX_N + 5];
ConvexHullTrick cht;
vector<ii> adj[MAX_N + 5];
vector<int> ancestor;

void dfs(int u, int par) {
    if (u != 1) dp[u] = cht.query(V[u]) + f[u] * V[u] + S[u];
    cht.addLine(Line(-f[u], dp[u]));

    for (ii e : adj[u]) {
        int v = e.first, w = e.second;
        if (v == par) continue;
        f[v] = f[u] + w;
        dfs(v, u);
    };

    cht.rollback();
};

int main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    if (fopen("MAIN.INP", "r")) {
        freopen("MAIN.INP", "r", stdin);
        freopen("MAIN.OUT", "w", stdout);
    };

    cin >> n;
    for (int i = 1; i < n; i++) {
        int u, v, w;
        cin >> u >> v >> w;
        adj[u].push_back(ii(v, w));
        adj[v].push_back(ii(u, w));
    };

    for (int i = 2; i <= n; i++) cin >> S[i] >> V[i];

    dfs(1, 1);

    for (int u = 2; u <= n; u++) cout << dp[u] << " ";
};
