```go
package main
import (
"fmt"
)
func main() {
var n, m, a, b int
if _, err := fmt.Scan(&n, &m, &a, &b); err != nil {
return
}
a--
b--
adj := make([][]int, n)
for i := 0; i < m; i++ {
var u, v int
fmt.Scan(&u, &v)
u--
v--
adj[u] = append(adj[u], v)
adj[v] = append(adj[v], u)
}
p := make([]float64, n)
for i := 0; i < n; i++ {
fmt.Scan(&p[i])
}
if a == b {
for i := 0; i < n; i++ {
if i == a {
fmt.Printf("1.0 ")
} else {
fmt.Printf("0.0 ")
}
}
fmt.Println()
return
}
P := make([][]float64, n)
for i := 0; i < n; i++ {
P[i] = make([]float64, n)
P[i][i] = p[i]
deg := len(adj[i])
if deg > 0 {
prob := (1.0 - p[i]) / float64(deg)
for _, v := range adj[i] {
P[i][v] = prob
}
}
}
K := n * (n - 1) / 2
A := make([][]float64, K)
for i := range A {
A[i] = make([]float64, K)
}
B := make([]float64, K)
getIndex := func(u, v int) int {
if u > v {
u, v = v, u
}
idx := 0
for i := 0; i < u; i++ {
idx += n - 1 - i
}
idx += v - u - 1
return idx
}
for u := 0; u < n; u++ {
for v := u + 1; v < n; v++ {
row := getIndex(u, v)
if (a == u && b == v) || (a == v && b == u) {
B[row] = 1.0
}
for up := 0; up < n; up++ {
for vp := up + 1; vp < n; vp++ {
col := getIndex(up, vp)
term := P[up][u]*P[vp][v] + P[up][v]*P[vp][u]
if row == col {
A[row][col] = 1.0 - term
} else {
A[row][col] = -term
}
}
}
}
}
for i := 0; i < K; i++ {
pivot := i
for j := i + 1; j < K; j++ {
if abs(A[j][i]) > abs(A[pivot][i]) {
pivot = j
}
}
A[i], A[pivot] = A[pivot], A[i]
B[i], B[pivot] = B[pivot], B[i]
inv := 1.0 / A[i][i]
for j := i; j < K; j++ {
A[i][j] *= inv
}
B[i] *= inv
for j := 0; j < K; j++ {
if i != j && A[j][i] != 0 {
factor := A[j][i]
for k := i; k < K; k++ {
A[j][k] -= factor * A[i][k]
}
B[j] -= factor * B[i]
}
}
}
ans := make([]float64, n)
for k := 0; k < n; k++ {
for up := 0; up < n; up++ {
for vp := up + 1; vp < n; vp++ {
col := getIndex(up, vp)
ans[k] += B[col] * P[up][k] * P[vp][k]
}
}
}
for i := 0; i < n; i++ {
fmt.Printf("%.10f ", ans[i])
}
fmt.Println()
}
func abs(x float64) float64 {
if x < 0 {
return -x
}
return x
}
```