#include<bits/stdc++.h>
using namespace std;
#define int long long
struct edge{
int to,next;
}e[2000005];
int head[1000005],cnt=0;
long long ans=0;
vector<int>tmp[1000005];
void adde(int x,int y){
cnt++;
e[cnt].to=y;
e[cnt].next=head[x];
head[x]=cnt;
}
vector<int>lis;
int fa[1000005];
int find(int x){
return x==fa[x]?fa[x]:find(fa[x]);
}
int vis[1000005], val[1000005], visit[1000005];
long long dp[1000005][2];
int li[1000005],c2=0;
int flag=0;
void tree_dp(int p,int pa,int bana,int banb){
visit[p]=1;
for(int i=head[p];i!=-1;i=e[i].next){
if(e[i].to==pa||visit[e[i].to]||(p==banb&&e[i].to==bana)||(p==bana&&e[i].to==banb))continue;
tree_dp(e[i].to,p,bana,banb);
dp[p][0]+=dp[e[i].to][1];
dp[p][1]+=max(dp[e[i].to][0],dp[e[i].to][1]);
}
dp[p][0]+=val[p];
return;
}
void dfs(int k,int pa){
if(flag)return;
c2++;
li[c2]=k;
vis[k]=1;
for(int i=head[k];i!=-1;i=e[i].next){
if(e[i].to==pa)continue;
if(vis[e[i].to]){
memset(visit,0,sizeof(visit));
memset(dp,0,sizeof(dp));
tree_dp(k,-1,k,e[i].to);
long long t=0;
t=dp[k][1];
memset(visit,0,sizeof(visit));
memset(dp,0,sizeof(dp));
tree_dp(e[i].to,-1,k,e[i].to);
t=max(t,dp[e[i].to][1]);
ans+=t;
flag=1;
return;
}
dfs(e[i].to,k);
if(flag)return;
}
c2--;
}
signed main(){
int n,m,tm;
memset(head,-1,sizeof(head));
cin>>n;
tm=n;
for(int i=1;i<=n;i++){
fa[i]=i;
}
for(int i=1;i<=n;i++){
int x,y;
cin>>x>>y;
val[i]=x;
if(binary_search(tmp[i].begin(),tmp[i].end(),y))continue;
tmp[i].push_back(y);
tmp[y].push_back(i);
adde(i,y);
adde(y,i);
int fi=find(i),fy=find(y);
if(fi!=fy){
fa[max(fi,fy)]=min(fi,fy);
tm--;
}
}
for(int i=1;i<=n;i++){
lis.push_back(find(i));
}
sort(lis.begin(),lis.end());
int lenl=unique(lis.begin(),lis.end())-lis.begin();
for(int j=0;j<lenl;j++){
int i=lis[j];
c2=0;
memset(vis,0,sizeof(vis));
flag=0;
dfs(i,-1);
if(!flag){
tree_dp(i,-1,i,i);
ans+=max(dp[i][0],dp[i][1]);
memset(visit,0,sizeof(visit));
memset(dp,0,sizeof(dp));
}
}
cout<<ans;
}