int dp[MAXN][3],hson[MAXN],dis[MAXN];
void dfs1(int u,int fa){
dp[u][0]=dp[u][1]=dp[u][2];
for(int i=head[u];i;i=edge[i].next){
int v=edge[i].to;
if(v==fa)continue;
dfs1(v,u);
if(dp[v][0]+edge[i].w>dp[u][0]){
hson[u]=v;
dp[u][1]=dp[u][0];
dp[u][0]=dp[v][0]+edge[i].w;
}
else if(dp[v][0]+edge[i].w>dp[u][1])
dp[u][1]=dp[v][0]+edge[i].w;
}
}
void dfs2(int u,int fa){
dis[u]=max(dp[u][0],dp[u][2]);
for(int i=head[u];i;i=edge[i].next){
int v=edge[i].to;
if(v==fa)continue;
if(v==hson[u])
dp[v][2]=edge[i].w+max(dp[u][1],dp[u][2]);
else
dp[v][2]=edge[i].w+max(dp[u][0],dp[u][2]);
dfs2(v,u);
}
}