#include<bits/stdc++.h>
using namespace std;
const int M = 1000005;
long long n, dp[M][2];
int a[M];
struct node {
int to, next;
}g[2 * M];
long long ans;
int cnt, head[M];
void add(int u, int v) {
g[cnt].to = v;
g[cnt].next = head[u];
head[u] = cnt;
++cnt;
}
bool vis[M];
int p1, p2, edge;
void dfs( int u, int fa) {
vis[u] = true;
for (int i = head[u]; i; i = g[i].next) {
int to = g[i].to;
if (to == fa ) {
continue;
}
if (!vis[to]) {
dfs(to, u);
} else {
p1 = to;
p2 = u;
edge = (i ^ 1);
}
}
}
void dfs2(int u, int fa) {
dp[u][1] = a[u];
dp[u][0] = 0;
for (int i = head[u]; i; i = g[i].next ) {
int to = g[i].to;
if (to == fa || i == edge || i == (1 ^ edge)) {
continue;
}
dfs2(to, u);
dp[u][0] += max (dp[to][0], dp[to][1]);
dp[u][1] += dp[to][0];
}
}
int main () {
cin >> n;
for (int i = 1; i <= n; i++ ) {
int num, v;
cin >> num >> v;
a[i] = num;
add(i, v );
add(v, i );
}
for (int i = 1; i <= n; i++ ) {
if (vis[i] == 0) {
dfs(i, -1);
long long tmp = -100000;
dfs2(p1, -1);
tmp = max (tmp, dp[p1][0]);
dfs2(p2, -1);
ans += max (tmp, dp[p2][0]);
}
}
cout << ans << "\n";
return 0;
}