#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();
}