#include <bits/stdc++.h>
using namespace std;
const int oo = 0x3f3f3f3f;
const double eps = 1e-9;
vector<int> adj[100100];
int sp[100100], fp[100100];
int ed[100100][2], N;
double dp[100100][2];
int pro[100100][2], sfp, ssp;
int useless[100100][2];
void calc1(int ii, int nr) {
  int &pr = pro[ii][nr];
  int &st = useless[ii][nr];
  if (pr != -1) return;
  st = 0;
  int n = ed[ii][nr];
  pr = fp[n];
  for (int i = (0); i < (int((adj[n]).size())); i++)
    if (adj[n][i] != ii) {
      int k = 0;
      if (ed[adj[n][i]][0] == n) k = 1;
      calc1(adj[n][i], k);
      pr += pro[adj[n][i]][k];
      st += useless[adj[n][i]][k] + 2;
    }
  for (int i = (0); i < (int((adj[n]).size())); i++)
    if (adj[n][i] != ii) {
      int k = 0;
      if (ed[adj[n][i]][0] == n) k = 1;
      pro[adj[n][i]][k ^ 1] = sfp - pro[adj[n][i]][k];
      useless[adj[n][i]][k ^ 1] = 2 * (N - 1) - useless[adj[n][i]][k] - 2;
    }
}
double help[10][100100];
int helpid[100100][2];
void calc(int ii, int nr) {
  int &pr = pro[ii][nr];
  int &st = useless[ii][nr];
  double &res = dp[ii][nr];
  if (res > -0.5) return;
  res = 0;
  int n = ed[ii][nr];
  if (pr != fp[n]) {
    if (helpid[n][0] == -1) {
      help[2][n] = 0.0;
      for (int i = (0); i < (int((adj[n]).size())); i++)
        if (adj[n][i] != ii) {
          int k = 0;
          if (ed[adj[n][i]][0] == n) k = 1;
          calc(adj[n][i], k);
          res += (pro[adj[n][i]][k]) / ((double)pr) * (dp[adj[n][i]][k] + 1);
          help[2][n] += (pro[adj[n][i]][k]) * (dp[adj[n][i]][k] + 1);
        }
      helpid[n][0] = ii;
      helpid[n][1] = nr;
    } else {
      if (helpid[n][0] != -2) {
        calc(helpid[n][0], helpid[n][1] ^ 1);
        help[2][n] += (pro[helpid[n][0]][helpid[n][1] ^ 1]) *
                      (dp[helpid[n][0]][helpid[n][1] ^ 1] + 1);
        helpid[n][0] = -2;
      }
      res += (help[2][n] - pro[ii][nr ^ 1] * (dp[ii][nr ^ 1] + 1)) /
             ((double)(pr));
    }
    double relevantUseless = help[0][n] - (useless[ii][nr ^ 1] + 2) * 0.5;
    res += relevantUseless * (pr - fp[n]) / ((double)pr);
    double relevantUseless2 =
        help[1][n] + (useless[ii][nr ^ 1] + 2) * 0.5 * (double)pro[ii][nr ^ 1];
    res += relevantUseless2 / ((double)pr);
  }
}
int main() {
  scanf("%d", &N);
  for (int i = (0); i < (N - 1); i++)
    for (int j = (0); j < (2); j++) scanf("%d", &(ed[i][j]));
  for (int i = (0); i < (N - 1); i++)
    for (int j = (0); j < (2); j++) --ed[i][j];
  for (int i = (0); i < (N); i++) scanf("%d%d", sp + i, fp + i);
  for (int i = (0); i < (N); i++) adj[i].clear();
  for (int i = (0); i < (N - 1); i++)
    for (int j = (0); j < (2); j++) adj[ed[i][j]].push_back(i);
  ssp = 0;
  for (int i = (0); i < (N); i++) ssp += sp[i];
  sfp = 0;
  for (int i = (0); i < (N); i++) sfp += fp[i];
  memset(pro, -1, sizeof(pro));
  for (int i = (0); i < (N - 1); i++)
    for (int j = (0); j < (2); j++) calc1(i, j);
  for (int i = (0); i < (N); i++) {
    help[0][i] = 0.0;
    help[1][i] = 0.0;
    for (int j = (0); j < (int((adj[i]).size())); j++) {
      int k = 0;
      if (ed[adj[i][j]][0] == i) k = 1;
      help[0][i] += 0.5 * (useless[adj[i][j]][k] + 2);
      help[1][i] -=
          0.5 * (useless[adj[i][j]][k] + 2) * (double)(pro[adj[i][j]][k]);
    }
  }
  memset(helpid, -1, sizeof(helpid));
  for (int i = (0); i < (N - 1); i++)
    for (int j = (0); j < (2); j++) dp[i][j] = -1;
  for (int i = (0); i < (N - 1); i++)
    for (int j = (0); j < (2); j++) calc(i, j);
  double res = 0.0;
  for (int i = (0); i < (N); i++) {
    double cur = 0.0;
    for (int j = (0); j < (int((adj[i]).size())); j++) {
      int k = 0;
      if (ed[adj[i][j]][0] == i) k = 1;
      cur += (pro[adj[i][j]][k] / (double)(sfp)) * (dp[adj[i][j]][k] + 1);
      cur += (sfp - pro[adj[i][j]][k] - fp[i]) / (double)(sfp)*0.5 *
             (useless[adj[i][j]][k] + 2);
    }
    res += cur * sp[i];
  }
  res /= ssp;
  printf("%.12lf\n", res);
  return 0;
}
