#include <bits/stdc++.h>
using namespace std;
template <class T>
inline void upmax(T& a, T b) {
  if (a < b) a = b;
}
template <class T>
inline void upmin(T& a, T b) {
  if (a > b) a = b;
}
const int maxn = 100007;
const int maxm = 200007;
const int mod = 1000000007;
const int inf = 0x7fffffff;
typedef int arr[maxn];
typedef int adj[maxm];
inline int add(int a, int b) { return ((long long)a + b) % mod; }
inline int mul(int a, int b) { return ((long long)a * b) % mod; }
inline int dec(int a, int b) { return add(a, mod - b % mod); }
inline int Pow(int a, int b) {
  int t = 1;
  while (b) {
    if (b & 1) t = mul(t, a);
    a = mul(a, a), b >>= 1;
  }
  return t;
}
template <typename Type>
inline Type RD() {
  char c = getchar();
  Type x = 0, flag = 1;
  while (!isdigit(c) && c != '-') c = getchar();
  if (c == '-')
    flag = -1;
  else
    x = c - '0';
  while (isdigit(c = getchar())) x = x * 10 + c - '0';
  return x * flag;
}
inline char rdch() {
  char c = getchar();
  while (!isalpha(c)) c = getchar();
  return c;
}
arr head, f, g, sz;
adj to, nxt;
int ett;
inline void ins(int u, int v) {
  to[++ett] = v, nxt[ett] = head[u], head[u] = ett;
  to[++ett] = u, nxt[ett] = head[v], head[v] = ett;
}
int n, F, G;
void input() {
  n = RD<int>();
  for (int i = 2, _ = n; i <= _; i++) ins(RD<int>(), RD<int>());
  for (int i = 1, _ = n; i <= _; i++)
    F += (f[i] = RD<int>()), G += (g[i] = RD<int>());
}
long long ans;
void dfs(int u, int p = 0) {
  sz[u] = 1;
  for (int i = head[u]; i; i = nxt[i]) {
    int v = to[i];
    if (v == p) continue;
    dfs(v, u);
    sz[u] += sz[v], f[u] += f[v];
    ans += 1ll * g[u] * sz[v] * f[v];
  }
  ans += 1ll * g[u] * (n - sz[u]) * (F - f[u]);
}
void solve() {
  dfs(1);
  printf("%.10lf\n", ans / ((double)F * G));
}
int main() {
  input();
  solve();
  return 0;
}
