rt;球球
#include<bits/stdc++.h>
using namespace std;
#define F(i,a,b) for(int i=a;i<=b;i++)
#define nF(i,a,b) for(int i=a;i<b;i++)
#define uF(i,a,b) for(int i=a;i>=b;i--)
#define unF(i,a,b) for(int i=a;i>b;i--)
inline long long read() {
long long x,f;char ch;
for(f=0;!isdigit(ch=getchar());f=ch=='-');
for(x=ch-48;isdigit(ch=getchar());x=x*10+ch-48);
return f?-x:x;
}
inline void print(long long x,char las) {
if(!x) {
putchar('0'),putchar(las);
return ;
}
if(x<0) putchar('-'),x=-x;
int ls[30],k=0;
while(x) ls[++k]=x%10,x/=10;
while(k) putchar(ls[k--]+48);
putchar(las);
return ;
}
int rs;
struct edge {
int to;
edge *next;
}rd[1000050],*head[1000050];
int n=read();
long long po[1000050];
bitset<1000050>vis;int rt1,rt2;
inline void dfs(int x) {
vis[x]=1;
for(edge *i=head[x];i;i=i->next) {
int nex=i->to;
if(vis[nex]) {
rt1=nex;rt2=x;
continue;
}
dfs(nex);
}
return ;
}
long long dp[2][1000001];
inline void ddp(int x) {
dp[1][x]=po[x];dp[0][x]=0;
for(edge *i=head[x];i;i=i->next) {
int nex=i->to;
if(nex==rt1) continue;
ddp(nex);
dp[1][x]+=dp[0][nex];
dp[0][x]+=max(dp[0][nex],dp[1][nex]);
}
// printf("%d ; %lld ; %lld\n",x,dp[0][x],dp[1][x]);
return ;
}
long long ans;
inline void done(int x) {
dfs(x);
ddp(rt1);
// puts("");
long long k1=dp[0][rt1];
swap(rt1,rt2);
ddp(rt1);
// puts("");
ans+=max(k1,dp[0][rt1]);
}
int main() {
F(i,1,n) {
po[i]=read();int d=read();
rd[rs].to=i;rd[rs].next=head[d];head[d]=&rd[rs++];
}
F(i,1,n) if(!vis[i]) done(i);
print(ans,'\n');
return 0;
}