#include <bits/stdc++.h>
const int INF = 0x3f3f3f3f;
const long long int INFLL = 0x3f3f3f3f3f3f3f3fll;
long long int getint() {
  long long int ret = 0;
  bool f = 0;
  char c;
  while ((c = getchar()) < '0' || c > '9')
    if (c == '-') f ^= 1;
  while (c >= '0' && c <= '9') {
    ret = ret * 10 + c - '0';
    c = getchar();
  }
  return f ? -ret : ret;
}
using namespace std;
const int MAXN = 100000;
struct edge {
  int v;
  edge *nxt;
  edge() {}
  edge(int _v, edge *_nxt) {
    v = _v;
    nxt = _nxt;
  }
} E[2 * MAXN + 10], *cnte = E, *fir[MAXN + 10];
void addedge(int u, int v) {
  *cnte = edge(v, fir[u]);
  fir[u] = cnte++;
  *cnte = edge(u, fir[v]);
  fir[v] = cnte++;
}
int rk[MAXN + 10], clk = 0, fa[MAXN + 10], sz[MAXN + 10];
double px[MAXN + 10], py[MAXN + 10], dp[MAXN + 10];
void dfs(int u, int f) {
  rk[++clk] = u;
  for (edge *p = fir[u]; p; p = p->nxt)
    if (p->v != f) {
      int v = p->v;
      dfs(v, u);
    }
}
void init(int u, int f) {
  fa[u] = f;
  dp[u] = 0;
  sz[u] = 1;
  for (edge *p = fir[u]; p; p = p->nxt)
    if (p->v != f) {
      int v = p->v;
      init(v, u);
      dp[u] += dp[v];
      sz[u] += sz[v];
    }
  dp[u] += py[u] * (sz[u] - 1);
}
void solve(int u, int f) {
  if (fa[u] == f) return;
  if (fa[u] == -1) {
    dp[u] -= py[u] * (sz[u] - 1) + dp[f];
    sz[u] -= sz[f];
    dp[u] += py[u] * (sz[u] - 1);
  } else {
    solve(fa[u], u);
    dp[u] -= py[u] * (sz[u] - 1) + dp[f] - dp[fa[u]];
    sz[u] -= sz[f] - sz[fa[u]];
    dp[u] += py[u] * (sz[u] - 1);
  }
  fa[u] = f;
}
int main() {
  int n = getint();
  for (int i = 1; i < n; ++i) addedge(getint(), getint());
  int sumx = 0, sumy = 0;
  for (int i = 1; i <= n; ++i) {
    sumx += px[i] = getint();
    sumy += py[i] = getint();
  }
  for (int i = 1; i <= n; ++i) {
    px[i] /= sumx;
    py[i] /= sumy;
  }
  dfs(1, 0);
  init(1, -1);
  double ans = px[1] * (n - 1 - dp[1]);
  for (int i = 2; i <= n; ++i) {
    int u = rk[i];
    solve(u, -1);
    ans += px[u] * (n - 1 - dp[u]);
  }
  printf("%.20f\n", ans);
  return 0;
}
