//求大佬指点 不知道对不对
#include<iostream>
#include<vector>
using namespace std;

int GetMaxScore(vector<int> &vec,vector<int> value);

int main()
{
    int N;
    while (cin >> N)
    {
        int Ai, Bi;
        vector<int> value;
        vector<int> path(N,-1);
        for (int i = 0; i < N; i++)
        {
            cin >> Ai >> Bi;
            value.push_back(Ai);
            path[i] = (Bi - 1);
        }
        int result = GetMaxScore(path,value);
        cout << result << endl;
    }
    return 0;
}

int GetMaxScore(vector<int> &vec, vector<int> value)
{
    vector<bool> isvisited(vec.size(), false);
    int result = -99999999;
    for (int i = 4; i < vec.size(); i++)
    {
        int j = i;
        int result1 = 0;
        int times = 1;
        int Max = -9999;
        while (vec[j] != -1 && times <= vec.size())
        {
            if (!isvisited[j])
            {
                result1 += value[j];
            }
            if (result1 > Max)
            {
                Max = result1;
            }
            j = vec[j];
            times++;
        }
        isvisited = vector<bool>(vec.size(), false);
        if (result < Max)
            result = Max;
    }
    return result;
}