#include<bits/stdc++.h>
using namespace std;
#define fi first
#define se second
#define pb push_back
#define ll long long
#define ld long double
#define mp make_pair
template<typename T1,typename T2>void chmn(T1 &x,const T2 &y){x=x<y?x:y;}
template<typename T1,typename T2>void chmx(T1 &x,const T2 &y){x=x>y?x:y;}
const int N=2e5+50;
vector<int>E[N];
int par[N],val[N];
ll dp[N],dp1[N];
void DFS(int u){
    for(auto i:E[u]){
        DFS(i);
        chmx(dp[u],dp[i]+val[i]);
    }
}
void DFS1(int u){
    int m=E[u].size();
    ll prefmx[m+1]={0},sufmx[m+1]={0};
    for(int i=0;i<m;i++)prefmx[i+1]=max(prefmx[i],dp[E[u][i]]+val[E[u][i]]);
    for(int i=m-1;i>=0;i--)sufmx[i]=max(sufmx[i+1],dp[E[u][i]]+val[E[u][i]]);
    for(int i=0;i<m;i++){
        dp1[E[u][i]]=max({dp1[u],prefmx[i],sufmx[i+1]})+val[i];
    }
    for(auto i:E[u])DFS1(i);
}
void Bumerang(int n,int q,int* p,int* w,int* U,int* W,ll* ans){
    if(n*q>25000010)return;
    for(int i=2;i<=n;i++){
        par[i]=p[i];
        val[i]=w[i];
        E[par[i]].pb(i);
    }
    //for(int i=1;i<=n;i++){printf("%i: ",i);for(auto j:E[i])printf("%i ",j);printf("\n");}
    //for(int i=1;i<=n;i++)printf("%i ",val[i]);printf("\n");
    multiset<int>st;
    for(int i=2;i<=n;i++)st.insert(val[i]);
    for(int I=1;I<=q;I++){
        /*st.erase(st.find(val[U[I]]));
        val[U[I]]=W[I];
        st.insert(W[I]);
        int x=*st.rbegin();
        st.erase(st.find(x));
        int y=*st.rbegin();
        st.erase(st.find(y));
        int z=*st.rbegin();
        st.erase(st.find(z));
        ans[I]=x+y+z;
        st.insert(x);
        st.insert(y);
        st.insert(z);*/
        val[U[I]]=W[I];
        for(int i=1;i<=n;i++)dp[i]=dp1[i]=0;
        DFS(1);
        DFS1(1);
        //for(int i=1;i<=n;i++)printf("%lld ",dp[i]);printf("\n");
        ll res=0;
        for(int u=1;u<=n;u++){
            vector<int>vals;
            if(u!=1)vals.pb(dp1[u]);
            for(auto i:E[u])vals.pb(dp[i]+val[i]);
            sort(vals.begin(),vals.end());
            reverse(vals.begin(),vals.end());
            if(vals.size()>=3)chmx(res,vals[0]+vals[1]+vals[2]);
        }
        ans[I]=res;
    }
}