#include<bits/stdc++.h>
#define int long long
using namespace std;
int n;
struct node{
int to,nxt,val;
}w[2000005];
int h[2000005],cntt=0;
void Link(int x,int y,int val){
++cntt;
w[cntt].to=y;
w[cntt].nxt=h[x];
w[cntt].val=val;
h[x]=cntt;
return ;
}
int read(){
int x=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9'){
if(ch=='-') f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9'){
x=(x<<1)+(x<<3)+ch-'0';
ch=getchar();
}
return x*f;
}
int help[2000005],qwq[2000005],cnt=0;
int vis[2000005],flag[2000005];
int firdfs(int x,int lst){
if(vis[x]){
vis[x]=2;
help[++cnt]=x;
flag[x]=1;
return 1;
}
vis[x]=1;
for(int i=h[x];i!=0;i=w[i].nxt){
int y=w[i].to;
if(!firdfs(y,i)) continue;
if(i==((lst-1)^1)+1) continue;
if(vis[x]!=2){
help[++cnt]=x;
flag[x]=1;
qwq[cnt]=qwq[cnt-1]+w[i].val;
}
else{
qwq[0]=qwq[1]-w[i].val;
return 0;
}
return 1;
}
return 0;
}
int maxx=0,dis[2000005],dp[2000005];
void secdfs(int x){
flag[x]=1;
for(int i=h[x];i!=0;i=w[i].nxt){
int y=w[i].to;
if(flag[y]) continue;
secdfs(y);
maxx=max(maxx,dis[x]+dis[y]+w[i].val);
dis[x]=max(dis[x],dis[y]+w[i].val);
}
return ;
}
deque<int> q;
int work(int rt){
for(int i=0;i<=2*cnt;i++){
dp[i]=0; dis[i]=0;
help[i]=0; qwq[i]=0;
}
cnt=0;
int ans0=0,ans1=0;
firdfs(rt,0);
for(int i=1;i<=cnt;i++){
maxx=0; secdfs(help[i]);
ans0=max(ans0,maxx);
dp[i]=dp[i+cnt]=dis[help[i]];
qwq[i+cnt]=qwq[i+cnt-1]+qwq[i]-qwq[i-1];
}
while(!q.empty()) q.pop_front();
for(int i=1;i<=2*cnt;i++){
while(!q.empty()&&q.front()<=i-cnt) q.pop_front();
if(!q.empty()) ans1=max(ans1,dp[i]+dp[q.front()]+qwq[i]-qwq[q.front()]);
while(!q.empty()&&dp[q.back()]-qwq[q.back()]<=dp[i]-qwq[i]) q.pop_back();
q.push_front(i);
}
return max(ans0,ans1);
}
signed main(){
n=read();
for(int i=1;i<=n;i++){
int u,val;
u=read(); val=read();
Link(i,u,val);
Link(u,i,val);
}
int ans=0;
for(int i=1;i<=n;i++){
if(!flag[i]) ans+=work(i);
}
printf("%lld\n",ans);
return 0;
}