#include<bits/stdc++.h>
using namespace std;
const int MAXN = 1e6 + 5;
int n , a[MAXN] , dp1[MAXN] , dp2[MAXN] , m , head[MAXN] , cnt;
struct node{
int to , nxt;
}edge[MAXN << 1];
void add(int u , int v) {
edge[++ cnt].to = v;
edge[cnt].nxt = head[u];
head[u] = cnt;
}
int p = 1e9 , q = 1;
int minn = 0x3f3f3f3f;
void update(int x , int y) {
if (p * y > q * x) {
p = x;
q = y;
}
}
void Dp(int now , int fa) {
int f1 = 0 , f2 = 0 , s1 = 0 , s2 = 0;
for (int i = head[now] ; i ; i = edge[i].nxt) {
int v = edge[i].to;
if (v != fa) {
Dp(v , now);
if (dp1[v] > dp1[f1]) {
f2 = f1;
f1 = v;
} else if (dp1[v] > dp1[f2]) {
f2 = v;
}
if (dp2[v] > dp2[s1]) {
s2 = s1;
s1 = v;
} else if (dp2[v] > dp2[s2]) {
s2 = v;
}
}
}
if (a[now] == 1) {
dp1[now] = dp1[f1] + 1;
update(1 , dp1[f1] + dp1[f2] + 1);
if (s1 != 0) {
dp2[now] = dp2[s1] + 1;
if (s1 != f1) {
update(2 , dp1[f1] + dp2[s1] + 1);
} else {
update(2 , dp1[f2] + dp2[s1] + 1);
if (s2 != 0) {
update(2 , dp1[f1] + dp2[s2] + 1);
}
}
}
} else if (a[now] == 2) {
dp2[now] = dp1[f1] + 1;
update(2 , dp1[f1] + dp1[f2] + 1);
}
}
void ggcd(ll p , ll q) {
int G = __gcd(p , q);
p /= G;
q /= G;
printf("%d/%d", p , q);
}
int main() {
scanf("%d", &n);
for (int i = 1 , u , v ; i < n ; i ++) {
scanf("%d %d", &u , &v);
add(u , v);
add(v , u);
}
for (int i = 1 ; i <= n ; i ++) {
scanf("%d", &a[i]);
minn = min(minn , a[i]);
}
if (minn > 1) {
printf("%d/1", minn);
return 0;
}
Dp(1 , 0);
ggcd(p , q);
return 0;
}