#include<bits/stdc++.h>
using namespace std;
#define int long long
int n;
struct node{
int to,next;
}e[4000005];
int head[2000005],cnt,val[2000005],ans=0,tt;
void add(int u,int v){
e[++cnt].to=v;
e[cnt].next=head[u];
head[u]=cnt;
}
int vis[2000005],mark1,mark2,t;
void dfs(int x,int fa){
vis[x]=1;
for(int i=head[x];i;i=e[i].next){
int v=e[i].to;
if(vis[v]==1&&t==0)mark1=v,mark2=x,t=1;
if(v!=fa&&vis[v]==0)dfs(v,x);
}
}
int f[2000005][2],vis2[2000005];
void dp(int x,int fa,int mark){
vis2[x]=mark;
f[x][0]=0;
f[x][1]=val[x];
for(int i=head[x];i;i=e[i].next){
int y=e[i].to;
if(y==fa||vis2[y]==mark){
continue;
}
dp(y,x,mark);
f[x][0]+=max(f[y][0],f[y][1]);
f[x][1]+=f[y][0];
}
}
signed main(){
int yy;
scanf("%lld",&n);
for(int i=1;i<=n;i++){
int pp;
scanf("%lld%lld",&val[i],&pp);
add(i,pp),add(pp,i);
}
for(int i=1;i<=n;i++){
if(vis[i]==0){
ans=0;
t=0;
dfs(i,0);
dp(mark1,0,++yy);
ans=max(ans,f[mark1][0]);
dp(mark2,0,++yy);
ans=max(ans,f[mark2][0]);
tt+=ans;
}
}
printf("%lld",tt);
return 0;
}