#include <bits/stdc++.h>
using namespace std;
const int64_t inf = 1e15;
int main() {
cin.tie(nullptr)->sync_with_stdio(false);
int n;
cin >> n;
vector<vector<int>> adj(n + 1);
vector<int> h(n + 1), c(n + 1), buff;
for (int i = 1, a; i <= n; ++i) {
cin >> a >> h[i] >> c[i];
if (a != i) {
adj[a].push_back(i);
}
buff.push_back(h[i]);
}
sort(buff.begin(), buff.end());
buff.erase(unique(buff.begin(), buff.end()), buff.end());
auto compr = [&](int i) { return lower_bound(buff.begin(), buff.end(), i) - buff.begin(); };
for (int i = 1; i <= n; ++i) {
h[i] = compr(h[i]);
}
auto dfs = [&](auto &&self, int u) -> map<int, int64_t> {
map<int, int64_t> dp;
dp[h[u]] = -c[u], dp[0] = c[u] * (h[u] != 0), dp[h[u] + 1] = c[u];
for (int &i : adj[u]) {
auto ch = self(self, i);
if (dp.size() < ch.size()) {
swap(dp, ch);
}
for (auto &[i, val] : ch) {
dp[i] += val;
if (dp[i] == 0) {
dp.erase(i);
}
}
}
for (auto it = dp.find(h[u]); it != dp.begin() && it->second < 0; --it) {
prev(it)->second += exchange(it->second, 0);
}
return dp;
};
cout << dfs(dfs, 1).begin()->second << '\n';
}