#include <bits/stdc++.h>
#define int long long
using namespace std;
inline 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*10+ch-48;
ch=getchar();
}
return x*f;
}
const int N = 1e6 + 10;
int dfn[N],f[N],tot;
int lp[N],siz;
struct node{
int v,w;
};
vector<node> e[N];
void dfs(int u,int fa,node edge){
dfn[u]=++tot;
for (auto x:e[u]){
int v=x.v;
if (fa==x.v && edge.v==u && x.w==edge.w) continue;
if (dfn[v]){
if (dfn[u]>dfn[v]){
continue;
}
lp[++siz]=v;
for(;v!=u;v=f[v]) lp[++siz]=f[v];
}
else{
f[v]=u;
dfs(v,u,x);
}
}
}
int vis[N],d[N],s[N],ans;
void dp(int u){
vis[u]=1;
for(auto x:e[u]){
int v=x.v,w=x.w;
if(vis[v]) continue;
dp(v);
ans=max(ans,d[u]+d[v]+w);
d[u]=max(d[u],d[v]+w);
}
}
int q[N];
inline int upd(int u){
return (u>=siz)?u-siz:u;
}
int l,r;
inline int solve(int u){
siz=0;
tot=0;
dfs(u,-1,{0,-1});
lp[0]=lp[siz];
for(int i=1;i<=siz;i++){
vis[lp[i]]=true;
}
int ans1=0,ans2=0;
for(int i=1;i<=siz;i++){
ans=0;
dp(lp[i]);
ans1=max(ans1,ans);
}
if(siz==2){
for (auto x:e[lp[1]]){
int v=x.v;
if(v==lp[2]){
ans2=max(2ll,d[lp[1]]+d[lp[2]]+x.w);
}
}
return max(ans1,ans2);
}
for(int i=1;i<=siz;i++){
int w;
for (auto x:e[lp[i]]){
int v=x.v;
if(v==lp[i-1]){
w=x.w;
break;
}
}
s[i]=s[i-1]+w;
}
for(int i=1;i<siz;i++) s[siz+i]=s[siz]+s[i];
l = r = 1;
q[1]=0;
for(int i=1;i<siz*2;i++){
while(l<=r && q[l]<=i-siz) l++;
while(l<=r && s[q[r]]-d[lp[upd(q[r])]]>=s[i]-d[lp[upd(i)]]) r--;
ans2=max(ans2,d[lp[upd(q[l])]]+d[lp[upd(i)]]+s[i]-s[q[l]]);
q[++r]=i;
}
return max(ans1,ans2);
}
int n;
signed main(){
n=read();
for (int u=1,v,w;u<=n;u++){
v=read(),w=read();
e[u].push_back({v,w});
e[v].push_back({u,w});
}
int ret=0;
for (int i=1;i<=n;i++){
if (!vis[i]){
ret+=solve(i);
}
}
cout << ret;
}