#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
long long n,a[N],f[N][2],fa[N],v[N];
long long cnt,ans;
struct edge{
int e,nxt;
}ed[N<<1];
int ft[N],en;
struct mmp{
int x,y;
}h[N];
void add(int x,int y)
{
ed[en].e=y;
ed[en].nxt=ft[x];
ft[x]=en++;
}
int fd(int x)
{
if(x!=fa[x])
fa[x]=fd(fa[x]);
return fa[x];
}
void dp(int x,int from)
{
f[x][0]=0;f[x][1]=a[x];
for(int i=ft[x];i;i=ed[i].nxt)
{
int y=ed[i].e;
if(y==from)continue;
dp(y,x);
f[x][0]+=max(f[y][1],f[y][0]);
f[x][1]+=f[y][0];
}
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
fa[i]=i;
for(int i=1;i<=n;i++)
{
int v;
cin>>a[i]>>v;
int x=fd(i),y=fd(v);
if(x!=y)
{
fa[y]=x;
add(i,v),add(v,i);
}
else
{
h[++cnt].x=i;
h[cnt].y=v;
}
}
for(int i=1;i<=cnt;i++)
{
dp(h[i].x,-1);
long long t=f[h[i].x][0];
dp(h[i].y,-1);
t=max(t,f[h[i].y][0]);
ans+=t;
}
cout<<ans;
return 0;
}