#include<stdio.h>
#include<stdlib.h>
using namespace std;
#include<queue>
struct G {
int in;
int nexts[1000];
int len;
int visit;
int weight;
int far;
}Node[10001];
int main() {
queue<int> queue;
int nodenum, a, i;
scanf_s("%d", &nodenum);
for (i = 1; i <= nodenum; i++) {
Node[i].far = -1;
scanf_s("%d %d", &a, &Node[i].weight);
while (1) {
scanf_s("%d", &a);
if (!a)break;
Node[a].nexts[Node[a].len++] = i;
Node[i].in++;
}
}//输入
for (i = 1; i < nodenum; i++) {
if (Node[i].in == 0)break;
}
Node[i].far = 0;
//找第一个入读为0的点
queue.push(i);
while (!queue.empty()) {
int temp = queue.front();
queue.pop();
Node[temp].visit = 1;
for (int i = 0; i < Node[temp].len; i++) {//遍历队列弹出点temp的所有连接点Node[temp].nexts[i]
if (Node[temp].far + Node[temp].weight > Node[Node[temp].nexts[i]].far) {
Node[Node[temp].nexts[i]].far = Node[temp].far + Node[temp].weight;
}
if (--Node[Node[temp].nexts[i]].in == 0 && Node[Node[temp].nexts[i]].visit == 0) {
queue.push(Node[temp].nexts[i]);
}
}
}
printf("%d", Node[nodenum].far + Node[nodenum].weight);
}