#include<bits/stdc++.h>
#define int long long
#define MAXN 1000001
using namespace std;
inline int read(){
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-f;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
int n,a[MAXN],dad[MAXN];
int u[MAXN],v[MAXN],cnt;
int f[MAXN][2],ans;
vector<int> e[MAXN];
inline int find(int x){
if(dad[x]==x) return x;
return dad[x]=find(dad[x]);
}
void dfs(int x,int fa){
f[x][0]=0;
f[x][1]=a[x];
for(register int i=0;i<e[x].size();i++)
if(e[x][i]!=fa){
dfs(e[x][i],x);
f[x][0]+=max(f[e[x][i]][1],f[e[x][i]][0]);
f[x][1]+=f[e[x][i]][0];
}
}
signed main(){
n=read();
for(register int i=1;i<=n;i++)
dad[i]=i;
for(register int i=1;i<=n;i++){
int x=read(),y=read();
int dx=find(i),dy=find(y);
a[i]=x;
if(dx==dy){
++cnt;
u[cnt]=i,v[cnt]=y;
}
else{
dad[dx]=dy;
e[i].push_back(y);
e[y].push_back(i);
}
}
for(register int i=1;i<=cnt;i++){
int mx;
dfs(u[i],0);
mx=f[u[i]][0];
dfs(v[i],0);
mx=max(mx,f[v[i]][0]);
ans+=mx;
}
cout<<ans;
return 0;
}