#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=400010;
struct edge
{
int net,v,w,id;
}e[N];
struct getin
{
int u,v,w,id;
}q[N];
int head[N],tot,dis[N],sum[N],n,ans,maxn;
void addedge(int u,int v,int w,int id)
{
tot++;
e[tot].v=v;
e[tot].w=w;
e[tot].id=id;
e[tot].net=head[u];
head[u]=tot;
}
bool getans(int now,int V,int fa)
{
if(now==V)
return 1;
for(int i=head[now];i;i=e[i].net)
{
int to=e[i].v;
if(to==fa)
continue;
if(getans(to,V,now))
{
sum[e[i].id]++;
return 1;
}
}
return 0;
}
struct node
{
int u;
int fa;
};
void find1(node x)
{
queue<node>que;
que.push(x);
while(!que.empty())
{
node u=que.front();
que.pop();
if(dis[u.u]>ans)
{
ans=dis[u.u];
maxn=u.u;
}
for(int i=head[u.u];i;i=e[i].net)
{
if(u.fa==e[i].v)
{
continue;
}
dis[e[i].v]=dis[u.u]+e[i].w;
que.push({e[i].v,u.u});
}
}
}
signed main()
{
cin>>n;
for(int i=1,x,y,z;i<n;i++)
{
scanf("%lld%lld%lld",&q[i].u,&q[i].v,&q[i].w);
q[i].id=i;
addedge(q[i].u,q[i].v,q[i].w,q[i].id);
addedge(q[i].v,q[i].u,q[i].w,q[i].id);
}
find1({1,0});
dis[maxn]=0;
find1({maxn,0});
cout<<ans<<'\n';
int T=10;
int rt1=1;
int rt2=1;
for(int i=1;i<=T;i++)
{
random_shuffle(q+1,q+n);
memset(head,0,sizeof(head));
tot=0;
memset(dis,0,sizeof(dis));
memset(e,0,sizeof(e));
for(int i=1;i<n;i++)
{
addedge(q[i].u,q[i].v,q[i].w,q[i].id);
addedge(q[i].v,q[i].u,q[i].w,q[i].id);
}
find1({1,0});
ans=0;
rt1=maxn;
memset(dis,0,sizeof(dis));
find1({rt1,0});
rt2=maxn;
getans(rt1,rt2,0);
}
int Ans=0;
for(int i=1;i<n*2+1;i++)
{
if(sum[i]==T)
{
Ans++;
}
}
printf("%lld",Ans-2);
return 0;
}