#include<bits/stdc++.h>
#define reg register int
#define il inline
#define fi first
#define se second
#define mk(a,b) make_pair(a,b)
#define numb (ch^'0')
#define int long long
using namespace std;
typedef long long ll;
template<class T>il void rd(T &x){
char ch;x=0;bool fl=false;
while(!isdigit(ch=getchar()))(ch=='-')&&(fl=true);
for(x=numb;isdigit(ch=getchar());x=x*10+numb);
(fl==true)&&(x=-x);
}
template<class T>il void output(T x){if(x/10)output(x/10);putchar(x%10+'0');}
template<class T>il void ot(T x){if(x<0) putchar('-'),x=-x;output(x);putchar(' ');}
template<class T>il void prt(T a[],int st,int nd){for(reg i=st;i<=nd;++i) ot(a[i]);putchar('\n');}
namespace Miracle{
const int N=2e5+5;
int n;
struct node{
int nxt,to;
ll val;
}e[2*N];
int hd[N],cnt;
void add(int x,int y,ll z){
e[++cnt].nxt=hd[x];
e[cnt].to=y;
e[cnt].val=z;
hd[x]=cnt;
}
ll f[N],g[N],pr[N],bc[N];
ll tmp[N],pa[N],ba[N];
ll om[N],im[N];
ll ms[N],bb[N];
ll ans=0;
int sta[N],top;
ll b[N][5];
int dep[N];
ll vf[N];
void dfs1(int x,int fa){//f pr bc im ans
int st=top;
dep[x]=dep[fa]+1;
for(reg i=hd[x];i;i=e[i].nxt){
int y=e[i].to;
if(y==fa) continue;
vf[y]=e[i].val;
sta[++top]=y;
dfs1(y,x);
bb[x]=max(bb[x],ms[x]);
ms[x]=max(ms[x],im[y]);
pr[y]=f[x];
pa[y]=tmp[x];
ans=max(ans,f[x]+f[y]+e[i].val);
im[x]=max(im[x],im[y]);
im[x]=max(im[x],f[x]+f[y]+e[i].val);
tmp[x]=max(tmp[x],f[x]+f[y]+e[i].val);
f[x]=max(f[x],f[y]+e[i].val);
}
ll mx=0,ma=0,mb=0;
while(top!=st){
int y=sta[top--];
bc[y]=mx;
ba[y]=ma;
bb[y]=max(bb[y],mb);
ma=max(ma,mx+f[y]+vf[y]);
mx=max(mx,f[y]+vf[y]);
mb=max(mb,im[y]);
}
}
void dfs2(int x,int fa){//g om
g[x]=max(g[fa],max(pr[x],bc[x]))+vf[x];
om[x]=max(max(max(pr[x]+bc[x],pr[x]+g[fa]),bc[x]+g[fa]),om[fa]);
om[x]=max(om[x],max(pa[x],ba[x]));
om[x]=max(om[x],bb[x]);
for(reg i=hd[x];i;i=e[i].nxt){
int y=e[i].to;
if(y==fa) continue;
dfs2(y,x);
}
}
int main(){
rd(n);
int x,y;ll z;
for(reg i=1;i<n;++i){
rd(x);rd(y);rd(z);
b[i][0]=x;b[i][1]=y;
b[i][2]=z;
add(x,y,z);add(y,x,z);
}
dfs1(1,0);
dfs2(1,0);
cnt=0;
ll lp=0;
for(reg i=1;i<n;++i){
if(dep[b[i][0]]<dep[b[i][1]]) swap(b[i][0],b[i][1]);
x=b[i][0],y=b[i][1];
ll con=f[x]+g[x];
lp=max(lp,con);
// cout<<" con "<<x<<" and "<<y<<" : "<<f[x]+g[y]+b[i][2]<<endl;
if(max(om[x],im[x])<con&&con==ans){
// cout<<x<<" and "<<y<<endl;
++cnt;
}
}
// cout<<" lp "<<lp<<endl;
// prt(dep,1,n);
// prt(f,1,n);
// prt(g,1,n);
// cout<<endl;
// prt(pr,1,n);
// prt(bc,1,n);
// cout<<endl;
// prt(im,1,n);
// prt(om,1,n);
// cout<<endl;
cout<<ans<<endl<<cnt;
return 0;
}
}
signed main(){
Miracle::main();
return 0;
}
/*
Author: *Miracle*
Date: 2019/4/12 20:26:26
*/