#include<bits/stdc++.h>
using namespace std;
#define int long long
int a[1000006];
long long val[1000006];
int y[1000006];
int cnt=0;
int root[1000006];
int croot[1000006];
int z[1000006];
vector<int> zz[1000006];
long long dp[10000006][2][3];
int q[1000006];
inline char nc(){
static char buf[1000010],*p1=buf,*p2=buf;
return p1==p2&&(p2=(p1=buf)+fread(buf,1,1000010,stdin),p1==p2)?EOF:*p1++;
}
inline int read(){
register int s=0,w=0;
static char ch=nc();
for(;!isdigit(ch);)ch=nc();
for(;isdigit(ch);){
s=(s<<1)+(s<<3)+(ch^48);
ch=nc();
}
return w?-s:s;
}
inline long long max0(long long a,long long b){
return a>b? a:b;
}
int p[1000006];
void find(int x){
int w=x;
y[x]=1;
int to=a[x];
q[1]=x;
p[x]=1;
int tot=1;
while(!y[to]){
tot++;
q[tot]=to;
p[to]=1;
y[to]=1;
x=to;
to=a[to];
}
if(p[to]){
cnt++;
root[cnt]=to;
croot[cnt]=x;
}
for(int i=1;i<=tot;i++)
p[q[i]]=0,q[i]=0;
}
int flag=0;
void dps(int b,int fa,int th,int op,int rt){
dp[b][1][op]=val[b];
for(int i=0;i<z[b];i++){
int to=zz[b][i];
if(to==fa||to==rt)
continue;
if(to==th){
if(flag==0){
flag=1;
}
else
continue;
}
dps(to,b,th,op,rt);
dp[b][1][op]+=dp[to][0][op];
dp[b][0][op]+=max0(dp[to][0][op],dp[to][1][op]);
}
if(b==th){
if(op==1)
dp[b][0][op]=-1e18;
if(op==2||op==0)
dp[b][1][op]=-1e18;
}
}
signed main(){
long long ans=0;
int n;
cin>>n;
for(int i=1;i<=n;i++){
val[i]=read();a[i]=read();
z[i]++;
z[a[i]]++;
zz[i].push_back(a[i]);
zz[a[i]].push_back(i);
}
for(int i=1;i<=n;i++){
flag=0;
if(!y[i])
find(i);
}
for(int i=1;i<=cnt;i++){
if((a[root[i]]==croot[i])&&(a[croot[i]]==root[i])&&z[root[i]]==2&&z[croot[i]]==2){
ans+=max0(val[root[i]],val[croot[i]]);
continue;
}
flag=0;
dps(root[i],0,croot[i],0,root[i]);
flag=0;
dps(root[i],0,croot[i],1,root[i]);
flag=0;
dps(root[i],0,croot[i],2,root[i]);
ans+=max0(max0(dp[root[i]][0][0],dp[root[i]][0][1]),dp[root[i]][1][2]);
}
cout<<ans;
return 0;
}