#include <bits/stdc++.h>
using namespace std;
namespace Flandre_Scarlet {
class Graph {
 public:
  int head[112345];
  int EdgeCount;
  struct Edge {
    int To, Label, Next;
  } Ed[112345 << 3];
  void clear() {
    memset(head, -1, sizeof(head));
    memset(Ed, -1, sizeof(Ed));
    EdgeCount = 0;
  }
  void AddEdge(int u, int v, int w = 1) {
    ++EdgeCount;
    Ed[EdgeCount] = (Edge){v, w, head[u]};
    head[u] = EdgeCount;
  }
  void Add2(int u, int v, int w = 1) {
    AddEdge(u, v, w);
    AddEdge(v, u, w);
  }
  int Start(int u) { return head[u]; }
  int To(int u) { return Ed[u].To; }
  int Label(int u) { return Ed[u].Label; }
  int Next(int u) { return Ed[u].Next; }
} G;
int n;
double p[112345], q[112345];
double sp = 0.00, sq = 0.00;
void R1(int &x) {
  x = 0;
  char c = getchar();
  int f = 1;
  while (c < '0' or c > '9') f = (c == '-') ? -1 : 1, c = getchar();
  while (c >= '0' and c <= '9')
    x = (x << 1) + (x << 3) + (c ^ 48), c = getchar();
  x = (f == 1) ? x : -x;
}
void Input() {
  R1(n);
  G.clear();
  for (int i = 1; i <= n - 1; ++i) {
    int u, v;
    R1(u), R1(v);
    G.Add2(u, v);
  }
  for (int i = 1; i <= n; ++i) {
    scanf("%lf%lf", &p[i], &q[i]);
    sp += p[i], sq += q[i];
  }
}
double ans = 0.00;
int size[112345];
void DFS(int u, int f) {
  size[u] = 1;
  for (int i = G.Start(u); ~i; i = G.Next(i)) {
    int v = G.To(i);
    if (v != f) {
      DFS(v, u);
      size[u] += size[v];
      p[u] += p[v];
      ans += q[u] * size[v] * p[v];
    }
  }
  ans += q[u] * (n - size[u]) * (sp - p[u]);
}
void Soviet() {
  DFS(1, 1);
  printf("%.12lf\n", ans / (sp * sq));
}
void IsMyWife() {
  Input();
  Soviet();
}
}  // namespace Flandre_Scarlet
int main() {
  Flandre_Scarlet::IsMyWife();
  getchar();
  getchar();
  return 0;
}
