#include<bits/stdc++.h>
using namespace std;
#define re register
long long n,val[1000001],f1[1000001][2],f2[1000001][2],head[1000001],tot,rt1,rt2,ans,temp;
bool flag1[1000001],flag[1000001],flag2[1000001];
struct node{
int next,to;
}edge[2000001];
inline void addedge(int u,int v){
edge[++tot].next=head[u];
edge[tot].to=v;
head[u]=tot;
}
void dp1(int now,int fa){
flag1[now]=1;
for(re int i=head[now];i;i=edge[i].next){
if(!flag1[edge[i].to]){
dp1(edge[i].to,now);
f1[now][1]+=f1[edge[i].to][0];
f1[now][0]+=max(f1[edge[i].to][1],f1[edge[i].to][0]);
}
}
}
void dp2(int now,int fa){
flag2[now]=1;
for(re int i=head[now];i;i=edge[i].next){
if(!flag2[edge[i].to]){
dp2(edge[i].to,now);
f2[now][1]+=f2[edge[i].to][0];
f2[now][0]+=max(f2[edge[i].to][1],f2[edge[i].to][0]);
}
}
}
void dfs(int now,int fa){
flag[now]=1;
for(re int i=head[now];i;i=edge[i].next){
if(!flag[edge[i].to]){
dfs(edge[i].to,now);
}
else if(fa==edge[i].to)continue;
else{
rt1=now;
rt2=edge[i].to;
dp1(rt1,-1);
dp2(rt2,-1);
ans+=max(f1[rt1][0],f2[rt2][0]);
}
}
}
int main(){
scanf("%d",&n);
int num;
for(re int i=1;i<=n;++i){
scanf("%d%d",&val[i],&num);
f1[i][1]=f2[i][1]=val[i];
addedge(num,i);
addedge(i,num);
}
for(re int i=1;i<=n;++i){
if(!flag[i]){
dfs(i,-1);
}
}
printf("%lld",ans);
}