#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define MAXN 21000
#define MAXV MAXN
#define MAXE MAXV*2
#define INF 0x3f3f3f3f
#define LL "%lld"
typedef long long qword;
typedef int aaa[3];
qword gcd(qword a,qword b)
{
return (a%b==0)?b:gcd(b,a%b);
}
struct Edge
{
int np,val;
int state;
int rec_size;
Edge *next,*neg;
}E[MAXE],*V[MAXV];
int tope=-1;
void addedge(int x,int y,int z)
{
E[++tope].np=y;
E[tope].val=z;
E[tope].next=V[x];
V[x]=&E[tope];
}
int bst_core,core_size;
int siz[MAXN];
int fa[MAXN];
int get_core(int now,int tree_size,int f)
{
Edge *ne;
int mxson=0;
int t,sum=1;
fa[now]=f;
for (ne=V[now];ne;ne=ne->next)
{
if (ne->np==f || ne->state)continue;
t=get_core(ne->np,tree_size,now);
sum+=t;
siz[ne->np]=t;
mxson=max(mxson,t);
}
mxson=max(mxson,tree_size-sum);
if (core_size>mxson)
{
core_size=mxson;
bst_core=now;
}
return sum;
}
void dfs(aaa& lst,int now,int f)
{
Edge *ne;
aaa at,ret;
lst[0]=1;lst[1]=lst[2]=0;
for (ne=V[now];ne;ne=ne->next)
{
if (ne->np==f || ne->state)continue;//Make sure searching in correct area
dfs(at,ne->np,now);
lst[(0+ne->val)%3]+=at[0];
lst[(1+ne->val)%3]+=at[1];
lst[(2+ne->val)%3]+=at[2];
}
}
qword solve(int now,int tree_size)
{
if (tree_size==1)
{
return 0;
}
Edge *ne;
int core;
qword ret=0;
core_size=INF;
int t=get_core(now,tree_size,now);
core=bst_core;
for (ne=V[core];ne;ne=ne->next)
{
if (!ne->state)
{
ne->state=core;
ne->neg->state=core;//This cannot be "now"
ne->rec_size=ne->np==fa[core]?t-siz[core]:siz[ne->np];
}
}
for (ne=V[core];ne;ne=ne->next)
{
if (ne->state!=core)continue;
ret+=solve(ne->np,ne->rec_size);
}
aaa at,at2,res;
res[0]=res[1]=res[2]=0;
for (ne=V[core];ne;ne=ne->next)
{
if (ne->state!=core)continue;
at2[0]=0;at2[1]=at2[2]=0;
dfs(at,ne->np,core);
at2[(0+ne->val)%3]+=at[0];
at2[(1+ne->val)%3]+=at[1];
at2[(2+ne->val)%3]+=at[2];
ret+=res[0]*at2[0] + res[1]*at2[2] + res[2]*at2[1];
ret+=at2[0];
res[0]+=at2[0];res[1]+=at2[1];res[2]+=at2[2];
}
for (ne=V[core];ne;ne=ne->next)
{
if (ne->state==core)
{
ne->state=ne->neg->state=0;
}
}
return ret;
}
int main()
{
freopen("input.txt","r",stdin);
int n;
int i,j,k,x,y,z;
scanf("%d",&n);
for (i=0;i<n-1;i++)
{
scanf("%d%d%d",&x,&y,&z);
addedge(x,y,z);
addedge(y,x,z);
V[x]->neg=V[y];
V[y]->neg=V[x];
}
qword a=solve(1,n)*2+n;
qword b=n*n;
qword c=gcd(a,b);
//cout<<a<<endl;
printf(LL "/" LL "\n",a/c,b/c);
}