#include <cmath>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <iostream>
using namespace std;
long long n,num,ans,tot,cnt;
double k;
long long root1,root2,bh;
int a[1000005];
int v[1000005];
int head[1000005];
long long dp[1000005][2];
struct node{
int to,next;
}e[2000005];
void add(long long from,long long to)
{
e[num].to=to;
e[num].next=head[from];
head[from]=num++;
}
void dfs(long long s,long long f)
{
v[s]=1;
for(long long i=head[s];i;i=e[i].next)
{
if((i^1)==f) continue;
if(v[e[i].to])
{
root1=s;
root2=e[i].to;
bh=i;
continue;
}
dfs(e[i].to,i);
}
}
void DP(long long s,long long f)
{
dp[s][1]=a[s];
dp[s][0]=0;
for(long long i=head[s];i;i=e[i].next)
{
if((i^1)==f) continue;
// if((s==root1&&e[i].to==root2)||
// (e[i].to==root1&&s==root2)) continue;
if(i==bh||(i^1)==bh) continue;
DP(e[i].to,i);
dp[s][0]+=max(dp[e[i].to][0],dp[e[i].to][1]);
dp[s][1]+=dp[e[i].to][0];
}
}
void solve(long long s)
{
dfs(s,0);
// cout<<root1<<" "<<root2<<endl;
ans=0;
DP(root1,-2);
ans=dp[root1][0];
DP(root2,-2);
ans=max(ans,dp[root2][0]);
// cout<<ans<<endl;
tot+=ans;
}
int main()
{
// freopen("a.out","w",stdout);
scanf("%lld",&n);
for(long long i=1;i<=n;i++)
{
int x,y;
scanf("%d%d",&x,&y);
add(i,y);add(y,i);a[i]=x;
}
for(long long i=1;i<=n;i++)
if(!v[i])solve(i);
cout<<tot;
return 0;
}