rt
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=(1e6)+5;
int par[maxn];
ll p[maxn];
vector<int>g[maxn];
int find(int x){
if(x==par[x])return x;
else return par[x]=find(par[x]);
}
void unit(int x,int y){
x=find(x);
y=find(y);
par[x]=y;
}
ll dp[maxn][2];
void dfs(int u,int fa){
dp[u][1]=p[u];
dp[u][0]=0;
for(int i=0;i<g[u].size();i++){
int v=g[u][i];
if(v==fa)continue;
dfs(v,u);
dp[u][1]+=dp[v][0];
dp[u][0]+=max(dp[v][0],dp[v][1]);
}
}
vector<int>s,t;
int main(){
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)par[i]=i;
for(int i=1;i<=n;i++){
scanf("%lld",&p[i]);
int u=i,v;
scanf("%d",&v);
if(find(u)==find(v)){
s.push_back(u);
t.push_back(v);
continue;
}
unit(u,v);
g[u].push_back(v);
g[v].push_back(u);
}
ll ans;
for(int i=0;i<s.size();i++){
ll a;
dfs(s[i],-1);
a=dp[s[i]][0];
dfs(t[i],-1);
a=max(a,dp[t[i]][0]);
ans+=a;
}
printf("%lld",ans);
return 0;
}