#include<cstdio>
#include<algorithm>
#define N 2245141
using namespace std;
int head[N],to[N],nxt[N],flg,vis[N],vis2[N],vis3[N],sp[N],s1,s2,bi,n,tot;
long long p[N],ans,dp[N][4];
void add(int u,int v){
to[++tot]=v;
nxt[tot]=head[u];
head[u]=tot;
}
void mark(int x){
sp[x]=1;
for(int i=head[x];i;i=nxt[i]){
int y=to[i];
if(!sp[y])mark(y);
}
}
void find(int x,int fa){
if(flg)return;
vis[x]=1;
for(int i=head[x];i;i=nxt[i]){
int y=to[i];
if(!vis[y])find(y,x);
else if(y!=fa){
s1=x,s2=y,bi=i;
flg=1;
return;
}
}
}
void dfs(int x,int cc){
dp[x][0+cc]=0;
dp[x][1+cc]=p[x];
if(cc==0)vis2[x]=1;
else vis3[x]=1;
for(int i=head[x];i;i=nxt[i]){
int y=to[i];
int v=(cc==0)?vis2[y]:vis3[y];
if(!v&&(i^1)!=bi){
dfs(y,cc);
dp[x][0+cc]+=max(dp[y][0+cc],dp[y][1+cc]);
dp[x][1+cc]+=dp[y][0+cc];
}
}
}
signed main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
int x;
scanf("%lld%d",&p[i],&x);
add(i,x);add(x,i);
}
for(int i=1;i<=n;i++){
if(sp[i])continue;
mark(i);
flg=0;
find(i,0);
dfs(s1,0);
dfs(s2,2);
ans+=max(dp[s1][0],dp[s2][2]);
}
printf("%lld",ans);
return 0;
}