#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <cmath>
#include <queue>
#include <map>
#include <stack>
#include <vector>
#include <algorithm>
//#include <time.h>
#define ll long long
#define sort stable_sort
using namespace std;
ll n;
ll first[2000010];
int f[2000010];
ll dep[2000010];
int tot=0;
struct node
{
ll u,v,w,to;
}q[4000010];
ll ls[2000010],rs[2000010],vis[2000010];
void add_edge(ll u,ll v,ll w)
{
tot++;
q[tot].u=u;
q[tot].v=v;
q[tot].w=w;
q[tot].to=first[u];
first[u]=tot;
}
ll tem=0,st;
void ddfs(int x,int fa)
{
f[x]=fa;
if(dep[x]>tem)
{
st=x;
tem=dep[x];
}
ll k=first[x];
while(k)
{
if(q[k].v!=fa && !vis[q[k].v])
{
dep[q[k].v]=dep[x]+q[k].w;
ddfs(q[k].v,x);
}
k=q[k].to;
}
}
ll kl[100010],kr[100010];
void zj_dfs(int x,int fa,int sbm)
{
int k=first[x];
while(k)
{
if(q[k].v!=fa && vis[q[k].v])
{
if(sbm==1)
{
ls[q[k].v]=ls[q[k].u]+q[k].w;
kl[q[k].v]=kl[q[k].u]+1;
}
else
{
rs[q[k].v]=rs[q[k].u]+q[k].w;
kr[q[k].v]=kr[q[k].u]+1;
}
zj_dfs(q[k].v,x,sbm);
}
k=q[k].to;
}
}
int cnt=0;
int t[100010];
int main()
{
cin>>n;
for(int i=1;i<n;i++)
{
ll u,v,w;
scanf("%lld%lld%lld",&u,&v,&w);
add_edge(u,v,w);
add_edge(v,u,w);
}
ddfs(1,0);
dep[st]=0;
tem=0;
memset(f,0,sizeof f);
ll all=st;
ddfs(st,0);
ll arr=st;
cout<<tem<<endl;
tem=0;
ll k=arr;
while(k)
{
vis[k]=1;
t[++cnt]=k;
k=f[k];
}
zj_dfs(all,0,1);
zj_dfs(arr,0,2);
ll al=all,ar=arr;
for(int i=1;i<=cnt;i++)
{
ll x=t[i];
dep[x]=0;
tem=0;
st=0;
ddfs(x,0);
if(tem==ls[x] && dep[st]>0 && st!=x)
{
al=x;
}
if(tem==rs[x] && dep[st]>0 && st!=x)
{
ar=x;
}
}
cout<<abs(kl[ar]-kl[al])<<endl;
return 0;
}