#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<cstring>
#include<string>
#include<algorithm>
#include<queue>
#include<vector>
#include<set>
#include<map>
using std::cin;using std::cerr;
using std::max;using std::min;
#define N 200005
#define ll long long
#define db double
#define pb push_back
#define dbg1(x) cerr<<#x<<"="<<(x)<<" "
#define dbg2(x) cerr<<#x<<"="<<(x)<<"\n"
int n,a,b,ecnt,last[N],fa[N],flag,top;ll Max1,Max2,l,r,mid;
struct node
{
	ll x,y;
	friend bool operator<(node t1,node t2) {return t1.x<t2.x||t1.x==t2.x&&t1.y<t2.y;}
}sta[N];
std::vector<node>S[N];
struct road{int to,v,nex;}e[N];
void adde(int u,int v,int w) {e[++ecnt]=(road){v,w,last[u]},last[u]=ecnt;}
void dfs(int x,ll d=0)
{
	if(d>Max1) Max2=Max1,Max1=d;
	else Max2=max(Max2,d);
	for(int k=last[x];k;k=e[k].nex) dfs(e[k].to,d+e[k].v);
}
void Solve(int x)
{
	if(flag) return;
	int to1=0,to2=0;S[x].clear();
	for(int k=last[x];k;k=e[k].nex)
	{
		to1?to2=e[k].to:to1=e[k].to;
		for(int i=0,sz=S[e[k].to].size();i<sz;i++)
			S[e[k].to][i].x+=e[k].v,S[e[k].to][i].y+=e[k].v;
	}
	if(!to1) return void(S[x].pb({0,0}));
	int sz1=S[to1].size(),sz2=S[to2].size();
	if(sz1>sz2) std::swap(to1,to2),std::swap(sz1,sz2);
	for(int i=0,j=0;i<sz1;i++)
	{
		for(;j<sz2&&S[to1][i].x+S[to2][j].y>mid;j++);
		if(j<sz2) sta[++top]={S[to2][j].x,S[to1][i].y};
	}
	for(int i=sz1-1,j=sz2-1;~i;i--)
	{
		for(;~j&&S[to1][i].y+S[to2][j].x>mid;j--);
		if(~j) sta[++top]={S[to1][i].x,S[to2][j].y};
	}
	if(!top) return void(flag=1);
	std::sort(sta+1,sta+1+top);
	node tmp;S[x].pb(tmp=sta[1]);
	for(int i=2;i<=top;i++) if(sta[i].x>tmp.x&&sta[i].y<tmp.y) tmp=sta[i],S[x].pb(tmp);
	top=0;
}
bool Judge()
{
	flag=0;
	for(int i=n;i;i--) Solve(i);
	return !flag;
}
int main()
{
	scanf("%d",&n);
	for(int i=2;i<=n;i++) scanf("%d%d",&a,&b),adde(a,i,b);
	dfs(1);
	for(l=0,r=Max1+Max2;l<r;) mid=l+r>>1,Judge()?r=mid:l=mid+1;
	printf("%lld\n",l);
	return 0;
}