#include<cstdio>
#include<cstring>
#include<iostream>
#define N 2000017
#define ll long long
using namespace std;
struct Edge{int v,w,next;}e[N];
int n,tot,top,num,cnt,head[N],st[N],dfn[N],cir[N],nxt[N],q[N];
bool b[N],opt[N],vis[N];ll res,ans,dis[N],sum[N],len[N],val[N];
void add(int u,int v,int w) {
e[++tot].v = v;e[tot].w = w;
e[tot].next = head[u];head[u] = tot;
}
void dfs1(int u) {
dfn[u] = ++num;st[++top] = u;opt[u] = 1;
for(int i = head[u];i;i = e[i].next){
int v = e[i].v;
if(b[i])continue;
if(dfn[v]){
if(dfn[v] > dfn[u])continue;
for(int j = top;st[j] != v;j -= 1)vis[st[j]] = 1,cir[++cnt] = st[j];
vis[v] = 1;cir[++cnt] = v;
}
else b[i] = b[i^1] = 1,dfs1(v);
}
top--;
}
void dfs2(int u,int f) {
len[u] = 0;
for(int i = head[u];i;i = e[i].next){
int v = e[i].v,w = e[i].w;
if(v == f || vis[v])continue;
dfs2(v,u);res = max(res,len[u]+len[v]+w);len[u] = max(len[u],len[v]+w);
}
}
void solve(int s) {
cnt = 0;res = 0;dfs1(s);
for(int i = 1;i <= cnt;i += 1)dfs2(cir[i],0),val[i] = len[cir[i]];
for(int i = 1;i < cnt;i += 1)nxt[i] = cir[i+1];nxt[cnt] = cir[1];
for(int i = 1;i <= cnt;i += 1)
for(int j = head[cir[i]];j;j = e[j].next){
int v = e[j].v,w = e[j].w;
if(v == nxt[i]){
dis[i] = w;
break;
}
}
for(int i = cnt+1;i <= 2*cnt;i += 1)val[i] = val[i-cnt],dis[i] = dis[i-cnt];
for(int i = 1;i <= 2*cnt;i += 1)sum[i] = sum[i-1]+dis[i-1];
int head = 1,tail = 1;q[1] = 1;
for(int i = 2;i <= 2*cnt;i += 1){
while(head <= tail && q[head] <= i-cnt)head++;
res = max(res,val[i]+val[q[head]]+sum[i]-sum[q[head]]);
while(head <= tail && val[q[tail]]-sum[q[tail]] <= val[i]-sum[i])tail--;
q[++tail] = i;
}
ans += res;
}
int main()
{
scanf("%d",&n);tot = 1;
for(int i = 1,v,w;i <= n;i += 1){
scanf("%d%d",&v,&w);
add(i,v,w);add(v,i,w);
}
for(int i = 1;i <= n;i += 1)
if(!opt[i])solve(i);
printf("%lld\n",ans);
return 0;
}