#include<bits/stdc++.h>
using namespace std;
int n,af[1000100],kn[1000100],in[1000100],r,l,tot[1000100][2],ans;
vector<int> e[1000100];
bool vis[1000100],vis1[1000100];
void top(){
queue<int> q;
for(int i=1;i<=n;i++)if(in[i]==1)q.push(i);
while(!q.empty()){
int x=q.front();
q.pop();
for(auto y:e[x]){
if(--in[y]==1)q.push(y);
}
}
}
void find(int i){
for(int i=1;i<=n;i++){
if(in[i]<=1)continue;
bool lcy=0;
for(auto j:e[i]){
if(in[j]>1){
lcy=1;
r=i;
l=j;
}
}
if(lcy)break;
}
return;
}
void dp(int x){
vis[x]=1;
vis1[x]=101010;
tot[x][0]=0;
tot[x][1]=kn[x];
for(auto y:e[x]){
if(vis1[y])continue;
dp(y);
tot[x][0]+=max(tot[y][1],tot[y][0]);
tot[x][1]+=tot[y][0];
}
}
int main(){
cin>>n;
for(int i=1;i<=n;i++){
scanf("%d %d",&kn[i],&af[i]);
e[i].push_back(af[i]);
e[af[i]].push_back(i);
in[af[i]]++;
in[i]++;
}
top();
for(int i=1;i<=n;i++){
if(vis[i]==1||in[i]<=1)continue;
find(i);
memset(tot,0,sizeof tot);
memset(vis1,0,sizeof vis1);
dp(r);
memset(tot,0,sizeof tot);
memset(vis1,0,sizeof vis1);
vis1[r]=1;
dp(l);
ans+=max(tot[r][0],tot[l][0]);
}
cout<<ans;
return 0;
}