#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e6+5;
int ins[N],pre[N],vis[N];
int dp[N][2],n,lt,rt,x,dp2[N][2][2];
vector<int>nbr[N],cir;
void dfs1(int cur,int fa)
{
pre[cur]=fa;
vis[cur]=ins[cur]=1;
for(int i=0;i<nbr[cur].size();i++)
{
int to=nbr[cur][i];
if(to==fa)continue;
if(vis[to])
{
if(ins[to])
{
lt=to;
rt=cur;
return;
}
continue;
}
pre[to]=cur;
dfs1(to,cur);
}
ins[cur]=0;
}
void dfs2(int cur,int fa)
{
for(int i=0;i<nbr[cur].size();i++)
{
int to=nbr[cur][i];
if(to==fa||vis[to])continue;
dfs2(to,cur);
dp[cur][0]+=max(dp[to][0],dp[to][1]);
dp[cur][1]+=dp[to][0];
}
}
signed main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>dp[i][1]>>x;
nbr[i].push_back(x);
nbr[x].push_back(i);
}
dfs1(1,0);
for(int i=lt;i!=rt;i=pre[i])cir.push_back(i);
cir.push_back(rt);memset(vis,0,sizeof(vis));
for(int i=0;i<cir.size();i++)vis[cir[i]]=1;
for(int i=0;i<cir.size();i++)dfs2(cir[i],0);
dp2[0][0][0]=dp[cir[0]][0];
dp2[0][1][1]=dp[cir[0]][1];
for(int i=1;i<cir.size();i++)
{
dp2[i][0][0]=dp2[i][0][1]=dp[cir[i]][0];
dp2[i][1][0]=dp2[i][1][1]=dp[cir[i]][1];
}
for(int i=1;i<cir.size()-1;i++)
{
dp2[i][0][0]+=max(dp2[i-1][1][0],dp2[i-1][0][0]);
dp2[i][0][1]+=max(dp2[i-1][1][1],dp2[i-1][0][1]);
dp2[i][1][0]+=dp2[i-1][0][0];
dp2[i][1][1]+=dp2[i-1][0][1];
}
if(cir.size()-1!=2)
{
dp2[cir.size()-1][0][0]+=max(dp2[cir.size()-2][0][0],dp2[cir.size()-2][1][0]);
dp2[cir.size()-1][0][1]+=max(dp2[cir.size()-2][0][1],dp2[cir.size()-2][1][1]);
dp2[cir.size()-1][1][0]+=dp2[cir.size()-2][0][0];
dp2[cir.size()-1][1][1]=-1e9;
}
cout<<max(max(dp2[cir.size()-1][0][0],dp2[cir.size()-1][0][1]),dp2[cir.size()-1][1][0]);
return 0;
}