#include <iostream>
#include <vector>
using namespace std;
typedef long long ll;
const int maxn = 1e6 + 10;
int n, top, tot, deg[maxn], stk[maxn], id[maxn];
ll ans, f[maxn][2], g[maxn], res[maxn];
vector<pair<int, int> > e[maxn];
void dfs(int u, int pa, int cur) {
f[u][0] = f[u][1] = 0;
for (auto [v, w] : e[u]) if (id[v] == -1 && v != pa) {
dfs(v, u, cur);
if (f[v][0] + w > f[u][0]) f[u][1] = f[u][0], f[u][0] = f[v][0] + w;
else if (f[v][0] + w > f[u][1]) f[u][1] = f[v][0] + w;
}
res[cur] = max(res[cur], f[u][0] + f[u][1] - 1);
}
void dfs2(int u) {
id[u] = tot;
for (auto [v, w] : e[u]) if (!id[v]) dfs2(v);
}
void dfs3(int u, int pa, int head, int cnt, ll cur, bool st) {
if (f[u][0]) ++cnt;
if (cnt > 2 - (!st) - (!f[u][0])) return;
cur += f[u][0]; res[id[u]] = max(res[id[u]], cur);
for (auto [v, w] : e[u]) if (~id[v] && v != pa && v != head) dfs3(v, u, head, cnt, cur + w, st);
}
int main() {
ios::sync_with_stdio(false);
cin >> n;
for (int u = 1; u <= n; u++) {
int v, w; cin >> v >> w;
e[u].emplace_back(v, w); e[v].emplace_back(u, w);
++deg[u]; ++deg[v];
}
for (int u = 1; u <= n; u++) if (deg[u] == 1) stk[++top] = u;
while (top) {
int u = stk[top--]; id[u] = -1;
for (auto [v, w] : e[u]) if (--deg[v] == 1) stk[++top] = v;
}
for (int u = 1; u <= n; u++) if (~id[u]) {
if (!id[u]) ++tot, dfs2(u);
dfs(u, 0, tot);
}
for (int u = 1; u <= n; u++) if (~id[u]) dfs3(u, 0, u, 0, 0, f[u][0]);
for (int u = 1; u <= tot; u++) ans += res[u];
cout << ans << '\n';
return 0;
}