#include <iostream>
using namespace std;
const int maxn = 1e4 + 3;
int n, cnt = 0;
int head[maxn], vis[maxn], t[maxn];
struct node
{
int next, to, t;
} e[maxn * 100];
void add(int from, int to, int t)
{
e[++cnt].next = head[from];
e[cnt].to = to;
e[cnt].t = t;
head[from] = cnt;
}
void dijkstra(void)
{
while(1)
{
int maxv = 0, maxm = 0;
for(int i = 1; i <= n; i++)
if(!vis[i] && t[i] > maxm)
maxv = i, maxm = t[i];
vis[maxv] = 1;
if(maxv == 0)
return;
for(int i = head[maxv]; i > 0; i = e[i].next)
{
int v = e[i].to;
if(e[i].t + t[maxv] > t[v])
t[v] = e[i].t + t[maxv];
}
}
}
int main(void)
{
int u, v, ti, ma = 0;
cin >> n;
for(int i = 0; i < n; i++)
{
cin >> u >> ti;
if(u == 1)
t[u] = ti;
while(cin >> v)
if(v != 0)
add(v, u, ti);
else
break;
}
dijkstra();
for(int i = 1; i <= n; i++)
ma = max(ma, t[i]);
cout << ma;
return 0;
}