package main
import (
"fmt"
"io"
"os"
)
type Scanner struct {
buf []byte
pos int
}
func NewScanner(r io.Reader) *Scanner {
buf, _ := io.ReadAll(r)
return &Scanner{buf: buf, pos: 0}
}
func (s *Scanner) NextInt() int {
for s.pos < len(s.buf) && s.buf[s.pos] <= ' ' {
s.pos++
}
if s.pos >= len(s.buf) {
return 0
}
res := 0
for s.pos < len(s.buf) && s.buf[s.pos] > ' ' {
res = res*10 + int(s.buf[s.pos]-'0')
s.pos++
}
return res
}
func (s *Scanner) NextInt64() int64 {
for s.pos < len(s.buf) && s.buf[s.pos] <= ' ' {
s.pos++
}
if s.pos >= len(s.buf) {
return 0
}
res := int64(0)
for s.pos < len(s.buf) && s.buf[s.pos] > ' ' {
res = res*10 + int64(s.buf[s.pos]-'0')
s.pos++
}
return res
}
func main() {
scanner := NewScanner(os.Stdin)
n := scanner.NextInt()
if n == 0 {
return
}
adj := make([][]int, n+1)
for i := 0; i < n-1; i++ {
u := scanner.NextInt()
v := scanner.NextInt()
adj[u] = append(adj[u], v)
adj[v] = append(adj[v], u)
}
x := make([]int64, n+1)
y := make([]int64, n+1)
var sumX, sumY int64
for i := 1; i <= n; i++ {
x[i] = scanner.NextInt64()
y[i] = scanner.NextInt64()
sumX += x[i]
sumY += y[i]
}
size := make([]int, n+1)
sumXsub := make([]int64, n+1)
children := make([][]int, n+1)
order := make([]int, 0, n)
queue := make([]int, 0, n)
queue = append(queue, 1)
visited := make([]bool, n+1)
visited[1] = true
for len(queue) > 0 {
u := queue[0]
queue = queue[1:]
order = append(order, u)
for _, v := range adj[u] {
if !visited[v] {
visited[v] = true
children[u] = append(children[u], v)
queue = append(queue, v)
}
}
}
for i := len(order) - 1; i >= 0; i-- {
u := order[i]
size[u] = 1
sumXsub[u] = x[u]
for _, v := range children[u] {
size[u] += size[v]
sumXsub[u] += sumXsub[v]
}
}
var totalSub float64 = 0
fSumX := float64(sumX)
fSumY := float64(sumY)
fN := float64(n)
for i := 1; i <= n; i++ {
if y[i] == 0 {
continue
}
var term float64 = 0
term += (float64(x[i]) / fSumX) * fN
term += (float64(sumX-sumXsub[i]) / fSumX) * float64(size[i])
for _, v := range children[i] {
term += (float64(sumXsub[v]) / fSumX) * float64(n-size[v])
}
totalSub += (float64(y[i]) / fSumY) * term
}
ans := fN - totalSub
if ans < 0 {
ans = 0
}
fmt.Printf("%.10f\n", ans)
}