#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1e5 + 10;
double dp_down[MAXN], dp_up[MAXN], dp_down2[MAXN], tx, ty;
int sz[MAXN], dis_down[MAXN], dis_up[MAXN], y_down[MAXN];
vector<int> a[MAXN];
int n, x[MAXN], y[MAXN];
void dfs1(int v, int par) {
  sz[v]++;
  y_down[v] += y[v];
  for (auto u : a[v])
    if (u != par) {
      dfs1(u, v);
      sz[v] += sz[u];
      y_down[v] += y_down[u];
      dis_down[v] += dis_down[u] + 1;
    }
}
void dfs2(int v, int par) {
  if (par != -1)
    dis_up[v] = dis_up[par] + 1 + dis_down[par] - (dis_down[v] + 1);
  for (auto u : a[v])
    if (u != par) {
      dfs2(u, v);
      dp_down2[u] =
          (double)(dis_down[v] - (dis_down[u] + 1) + 1) * y_down[u] / ty +
          dp_down[u];
      dp_down[v] += dp_down2[u];
    }
}
void dfs4(int v, int par) {
  if (par != -1)
    dp_up[v] =
        1 * (double)(ty - y_down[v]) / ty + dp_up[par] + dp_down[par] +
        (double)dis_up[par] * (y_down[par] - y[par] - (double)y_down[v]) / ty +
        (dis_down[par] - (double)(dis_down[v] + 1)) * (ty - y_down[par]) / ty -
        dp_down2[v] -
        (double)(dis_down[v] + 1) * (y_down[par] - y[par] - y_down[v]) / ty;
  for (auto u : a[v])
    if (u != par) dfs4(u, v);
}
int main() {
  scanf("%d", &n);
  for (int i = 0; i < n - 1; i++) {
    int x, y;
    scanf("%d %d", &x, &y);
    a[x].push_back(y);
    a[y].push_back(x);
  }
  for (int i = 1; i <= n; i++) {
    scanf("%d %d", &x[i], &y[i]);
    tx += x[i];
    ty += y[i];
  }
  dfs1(1, -1);
  dfs2(1, -1);
  dfs4(1, -1);
  double ans = 0;
  for (int i = 1; i <= n; i++) {
    double val1 = 0, val2 = 0;
    if (i != 1) val1 = (double)dis_up[i] * (y_down[i] - y[i]) / ty;
    val2 = (double)dis_down[i] * (ty - y_down[i]) / ty;
    ans += (double)(dp_down[i] + val1 + dp_up[i] + val2) * x[i] / tx;
  }
  printf("%.13f", ans);
  return 0;
}
