#include<bits/stdc++.h> using namespace std; struct edge{ int to,next,v; }e[40001]; int n,cnt,ans,root,sum,head[20001],son[20001],f[20001],d[20001],t[3]; bool vis[20001]; inline int gcd(int a,int b){ return b==0?a:gcd(b,a%b); } inline void insert(int u,int v,int w){ e[++cnt]=(edge){v,head[u],w};head[u]=cnt; e[++cnt]=(edge){u,head[v],w};head[v]=cnt; } inline void getroot(int x,int fa){ son[x]=1;f[x]=0; for(int i=head[x];i;i=e[i].next){ if(e[i].to==fa||vis[e[i].to])continue; getroot(e[i].to,x); son[x]+=son[e[i].to]; f[x]=max(f[x],son[e[i].to]); } f[x]=max(f[x],sum-son[x]); if(f[x]<f[root])root=x; } inline void getdeep(int x,int fa){ t[d[x]]++; for(int i=head[x];i;i=e[i].next){ if(e[i].to==fa||vis[e[i].to])continue; d[e[i].to]=(d[x]+e[i].v)%3; getdeep(e[i].to,x); } } inline int cal(int x,int now){ t[0]=t[1]=t[2]=0; d[x]=now;getdeep(x,0); return t[1]*t[2]*2+t[0]*t[0]; } inline void work(int x){ ans+=cal(x,0);vis[x]=1; for(int i=head[x];i;i=e[i].next) if(!vis[e[i].to]){ ans-=cal(e[i].to,e[i].v); root=0;sum=son[e[i].to]; getroot(e[i].to,0); work(root); } } int main(){ scanf("%d",&n); for(int i=1;i<n;++i){ int u,v,w; scanf("%d%d%d",&u,&v,&w); insert(u,v,w%3); } f[0]=sum=n; getroot(1,0); work(root); int t=gcd(ans,n*n); printf("%d/%d",ans/t,n*n/t); return 0; }