#include <bits/stdc++.h>
using namespace std;
#define int long long
const int MAXN = 2e5 + 5;
//const int MAXN = 5005;
const int MAXV = 1e9 + 1;
int n;
int parent[MAXN], h[MAXN], c[MAXN];
vector<int> con[MAXN];
map<int,int> difdp[MAXN];
void dfs(int nod)
{
int maxc = -1, heavy = -1;
for(int adj:con[nod])
{
dfs(adj);
if((int)difdp[adj].size() > maxc)
maxc = (int)difdp[adj].size(), heavy = adj;
}
if(heavy == -1)
{
difdp[nod][h[nod]] = 0;
difdp[nod][h[nod] + 1] = c[nod];
difdp[nod][MAXV] = 0;
}
else
{
swap(difdp[nod], difdp[heavy]);
for(int adj:con[nod])
{
if(adj == heavy)
continue;
for(auto it:difdp[adj])
{
difdp[nod][it.first] += it.second;
}
}
difdp[nod][1] += c[nod];
int ramas = c[nod];
auto it = difdp[nod].lower_bound(h[nod]);
while(ramas > 0)
{
int mnm = min(ramas, (*it).second);
(*it).second -= mnm;
ramas -= mnm;
if(ramas == 0)
break;
//remove it from map, to be O(n)-------------------------------------------------------
assert(it != difdp[nod].begin());
it--;
}
difdp[nod][h[nod] + 1] += c[nod];
}
//for(auto it:difdp[nod]) cerr<<nod<<": "<<it.first<<" "<<it.second<<" difdp\n"; cerr<<"\n\n";
}
void solve_tree()
{
for(int i=2;i<=n;i++)
con[parent[i]].push_back(i);
dfs(1);
cout<<difdp[1][1];
}
signed main()
{
ios_base::sync_with_stdio(0);cin.tie(0);
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>parent[i]>>h[i]>>c[i];
}
solve_tree();
return 0;
}