#include<bits/stdc++.h>
using namespace std;
#define N 1000005
#define int long long
int n,m;
vector<int> G[N];
int a[N];
int dp1[N][2],dp2[N][2];
bool used[N];
int x,y;
bool vis[N],vis1[N],vis2[N];
void bfs(int u){
used[u] = true;
for (auto v : G[u]){
if (!used[v]) bfs[v];
}
}
bool find_circle(int u,int fa){
vis[u] = true;
for (auto v : G[u]){
if (v == fa) continue;
if (!vis[v] && find_circle(v,u)) return true;
if (vis[v]){
x = u,y = v;
return true;
}
}
return false;
}
void dfs1(int u,int fa){
dp1[u][0] = 0;
dp1[u][1] = a[u];
vis1[u] = true;
for (auto v : G[u]){
if (v == fa || vis1[v] == true) continue;
dfs1(v,u);
dp1[u][0] += max(dp1[v][0],dp1[v][1]);
dp1[u][1] += dp1[v][0];
}
}
void dfs2(int u,int fa){
dp2[u][0] = 0;
dp2[u][1] = a[u];
vis2[u] = true;
for (auto v : G[u]){
if (v == fa || vis2[v] == true) continue;
dfs2(v,u);
dp2[u][0] += max(dp2[v][0],dp2[v][1]);
dp2[u][1] += dp2[v][0];
}
}
int ans;
signed main(){
cin >> n;
m = n;
for (int i = 1;i <= n;i++){
cin >> a[i];
int v;
cin >> v;
G[i].push_back(v);
G[v].push_back(i);
}
for (int i = 1;i <= n;i++){
if (used[i]) continue;
bfs(i);
bool flag = find_circle(i,0);
dfs1(x,0),dfs2(y,0);
ans += max(dp1[x][0],dp2[y][0]);
}
cout << ans << endl;
return 0;
}