#include<cstdio>
#define N 1000002
typedef long long lint;
int n;
lint a[N],b[N];
lint a2[N],b2[N];
lint ans=0;
int fa[N],in[N];
int q[N],ql=0,qr=0;
int o[N],op;
inline lint max(lint a,lint b){return a>b?a:b;}
int read(){
int x=0,c=getchar();
while(c>‘9‘||c<‘0‘)c=getchar();
while(c>=‘0‘&&c<=‘9‘){
x=x*10+c-‘0‘;
c=getchar();
}
return x;
}
int main(){
n=read();
for(int i=1;i<=n;i++){
a[i]=read();
++in[fa[i]=read()];
}
for(int i=1;i<=n;i++){
if(!in[i])q[qr++]=i;
}
while(ql<qr){
int w=q[ql++];
int u=fa[w];
b[u]+=max(a[w],b[w]);
a[u]+=b[w];
if(!--in[u])q[qr++]=u;
}
for(int i=1;i<=n;i++){
if(in[i]){
op=0;
int w=i;
lint s;
while(1){
o[op++]=w;
w=fa[w];
in[w]=0;
if(w==i)break;
}
o[op]=i;
a2[o[0]]=0;
b2[o[0]]=b[o[0]];
for(int j=1;j<op;j++){
a2[o[j]]=b2[o[j-1]]+a[o[j]];
b2[o[j]]=b[o[j]]+max(b2[o[j-1]],a2[o[j-1]]);
}
s=max(a2[o[op-1]],b2[o[op-1]]);
a2[o[1]]=0;
b2[o[1]]=b[o[1]];
for(int j=2;j<=op;j++){
a2[o[j]]=b2[o[j-1]]+a[o[j]];
b2[o[j]]=b[o[j]]+max(b2[o[j-1]],a2[o[j-1]]);
}
ans+=max(s,max(a2[o[op]],b2[o[op]]));
}
}
printf("%lld",ans);
return 0;
}