#include<bits/stdc++.h>
#define int long long
using namespace std;
const int maxn=1e6+5;
int n,l,r,k,o,ans,a[maxn],dp[maxn][2];
struct edge{
int to,id;
};
vector<edge> G[maxn];
bool vis[maxn],v[maxn],f[maxn];
void init(int u,int lst,int x){
if(v[u]){
l=u;
r=lst;
k=x;
return;
}
v[u]=1;
for(int i=0,len=G[u].size();i<len;++i){
int r=G[u][i].to,w=G[u][i].id;
init(r,u,w);
}
}
void dfs(int u){
vis[u]=1;
dp[u][1]=a[u];
dp[u][0]=0;
for(int i=0,len=G[u].size();i<len;++i){
int r=G[u][i].to,w=G[u][i].id;
if(vis[r]||f[w])
continue;
dfs(r);
dp[u][1]+=dp[r][0];
dp[u][0]+=max(dp[r][0],dp[r][1]);
}
}
signed main(){
scanf("%lld",&n);
for(int i=1,x;i<=n;++i){
scanf("%lld%lld",&a[i],&x);
G[i].push_back(edge({x,i*2-1}));
G[x].push_back(edge({i,i*2}));
}
for(int i=1;i<=n;++i)
if(!v[i]){
init(i,0,0);
if(k%2)
f[k]=f[k+1]=1;
else
f[k]=f[k-1]=1;
dfs(l);
o=dp[l][0];
memset(vis,0,sizeof(vis));
dfs(r);
ans+=max(o,dp[r][0]);
}
printf("%lld\n",ans);
return 0;
}