#include <bits/stdc++.h>
using namespace std;
int n,a[11451][3],fa[11451],sd[11451];
vector<int> mp[11451];
bool usd[11451];
int dfs(int k)
{
int t;
if(mp[k].empty())//是叶子节点
return sd[k]; //返回边值
int max1=0,max2=0,used=0;
for(auto i:mp[k]) {
t=dfs(i);
if(t>=max1) {
used=i;
max2=max1;
max1=t;
}
else
max2=max(max2,t);
}
a[k][1]=max1;
a[k][2]=max2;
usd[used]=1;//usd用于标记父节点的最优方案用到的子节点
return max1+sd[k];
}
void dfs2(int k)
{
if(usd[k])
a[k][0]=a[fa[k]][2];
else
a[k][0]=a[fa[k]][1];
a[k][0]=max(a[k][0],a[fa[k]][0])+sd[k];
for(auto i:mp[k])
dfs2(i);
return ;
}
int main()
{
cin>>n;
for(int i=2;i<=n;i++) {
cin>>fa[i]>>sd[i];
mp[fa[i]].push_back(i);
}
cout<<dfs(1)<<"\n";
dfs2(1);
for(int i=2;i<=n;i++)
cout<<max(a[i][0],a[i][1])<<"\n";
return 0;
}