#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<set>
#include<algorithm>
#include<map>
#include<vector>
#include<queue>
#include<iostream>
#include<string>
#include<cmath>
#define N 1000100
#define FOR(i,a,b) for(i=(a);i<=(b);i++)
#define ROF(i,a,b) for(i=(a);i>=(b);i--)
typedef long long LL;
using namespace std;
int n,Nxt[N],p[N],size[N],s1[N],s2[N],top1,top2;
LL f[N][2];
void init()
{
scanf("%d",&n);
int i;
FOR(i,1,n)
{
scanf("%d%d",&p[i],&Nxt[i]);
}
FOR(i,1,n) size[Nxt[i]]++;
FOR(i,1,n)
if (!size[i]) s1[++top1]=i;
}
void DP()
{
while (top1)
{
int u=s1[top1--],v=Nxt[u];
f[u][1]+=p[u];
f[v][1]+=f[u][0];
f[v][0]+=max(f[u][1],f[u][0]);
size[v]--;
if (!size[v]) s1[++top1]=v;
}
LL ans=0;int i,j;
FOR(i,1,n) if (size[i])
{
int u=i,top2=0;
do
{
s2[++top2]=u;
f[u][1]+=p[u];
size[u]=0;
u=Nxt[u];
}while (size[u]);
LL x=f[s2[top2]][0],y=0;
FOR(j,1,top2-1)
{
LL nx=max(x,y)+f[s2[j]][0];
LL ny=x+f[s2[j]][1];
x=nx;y=ny;
}
LL r1=max(x,y);
x=f[s2[1]][0],y=0;
ROF(j,top2,2)
{
LL nx=max(x,y)+f[s2[j]][0];
LL ny=x+f[s2[j]][1];
x=nx;y=ny;
}
LL r2=max(x,y);
ans+=max(r1,r2);
}
printf("%lld\n",ans);
}
int main()
{
init();
DP();
}