#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,U,V,E,ans,tot,cnt,a[1000005],h[1000005],dp[1000005][2];
vector<int>vec;
struct edge{
int v,nxt;
}e[2000005];
void adde(int u,int v){
e[++cnt].nxt=h[u];
h[u]=cnt;
e[cnt].v=v;
}
bool vis[1000005],f[1000005];
void dfs(int x,int fa,int id){
if(f[x]){
U=x,V=fa;
E=id;
return;
}
f[x]=1;
vec.push_back(x);
for(int i=h[x];i;i=e[i].nxt){
if(e[i].v==fa)continue;
dfs(e[i].v,x,i);
}
}
void dfs1(int x,int fa){
dp[x][1]=a[x];
for(int i=h[x];i;i=e[i].nxt){
if(vis[i]){
continue;
}
if(e[i].v==fa)continue;
dfs1(e[i].v,x);
dp[x][1]+=dp[e[i].v][0];
dp[x][0]+=max(dp[e[i].v][1],dp[e[i].v][0]);
}
}
signed main()
{
scanf("%lld",&n);
for(int i=1,v;i<=n;i++)scanf("%lld%lld",&a[i],&v),adde(i,v),adde(v,i);
for(int i=1;i<=n;i++){
if(!f[i]){
vec.clear();
dfs(i,0,0);
if(E&1)vis[E]=vis[E+1]=1;
else vis[E]=vis[E-1]=1;
dfs1(U,0);
tot=max(dp[U][0],dp[U][1]);
for(int j=0;j<vec.size();j++)dp[vec[j]][0]=dp[vec[j]][1]=0;
dfs1(V,0);
ans+=max(tot,max(dp[V][0],dp[V][1]));
}
}
printf("%lld",ans);
return 0;
}