#include <iostream>
#include <cstring>
#include <vector>
#include <cmath>
#include <algorithm>
#include <climits>
#include <queue>
#include <map>
#define endl "\n"
#define IOS ios::sync_with_stdio(false), cin.tie(0), cout.tie(0)
#define int long long
#define ULL unsigned long long
#define ls(k) k << 1
#define rs(k) k << 1 | 1
#define mid(a, b) (a + b) >> 1
const int N = 2e6 + 100, M = 520;
using namespace std;
inline int read(){
int num = 0;
char c;
bool flag = false;
while((c = getchar()) == ' ' || c == '\n' || c == '\r');
if(c == '-') flag = true;
else num = c - '0';
while(isdigit(c = getchar())) num = num * 10 + c - '0';
return (flag ? -1 : 1) * num;
}
int n, ans, node;
int fa[N], val[N];
int h[N], idx;
struct edge
{
int pre, to;
}e[N];
bool vis[N];
int f[N][2];
void add(int a, int b)
{
e[++ idx].pre = a, e[idx].to = b, h[a] = idx;
fa[b] = a;
}
void dfs(int u)
{
f[u][0] = 0, f[u][1] = val[u];
vis[u] = true;
for (int i = h[u]; i; i = e[i].pre)
{
int j = e[i].to;
if (j == node) f[j][1] = -N;
else
{
dfs(j);
f[u][0] += max(f[j][0], f[j][1]);
f[u][1] += f[j][0];
}
}
}
int work(int u)
{
vis[u] = true;
node = u;
while (!vis[fa[node]])
{
node = fa[node];
vis[node] = true;
}
dfs(node);
int res = max(f[node][0], f[node][1]);
vis[node] = true;
node = fa[node];
dfs(node);
return max(res, max(f[node][0], f[node][1]));
}
signed main()
{
IOS;
n = read();
for (int i = 1, d; i <= n; i ++ ) val[i] = read(), d = read(), add(d, i);
for (int i = 1; i <= n; i ++ )
{
if (!vis[i]) ans += work(i);
}
cout << ans;
}