#include
using namespace std;
const double eps = 1e-11; const int maxa = 23; const int maxn = 409;
int n, m, t, pa, pb, mp[maxa][maxa], deg[maxn]; double p[maxa], a[maxn][maxn], s[maxn];
inline double transPsb(int a, int b) { if (a == b) return p[a]; else if (!mp[a][b]) return 0; else return (1.0 - p[a]) / deg[a]; }
void guess() { for (int i = 0; i < t; ++ i) { int z; for (z = i; fabs(a[z][i]) < eps; ++ z); if (z > i) for (int k = i; k <= t; ++ k) swap(a[i][k], a[z][k]); for (int j = i + 1; j < t; ++ j) { double rat(a[j][i] / a[i][i]); for (int k = i; k <= t; ++ k) a[j][k] -= a[i][k] * rat; } } for (int i = t - 1; i >= 0; – i) { s[i] = - a[i][t]; for (int j = t - 1; j > i; – j) s[i] -= s[j] * a[i][j]; s[i] /= a[i][i]; } }
int main() { #ifndef ONLINE_JUDGE freopen(".in", “r”, stdin); #endif
scanf("%d%d%d%d", &n, &m, &pa, &pb);
-- pa, -- pb;
t = n * n;
memset(mp, 0, sizeof(mp));
memset(deg, 0, sizeof(deg));
while (m --) {
int u, v;
scanf("%d%d", &u, &v);
++ deg[-- u], ++ deg[-- v];
mp[u][v] = mp[v][u] = 1;
}
for (int i = 0; i < n; ++ i)
scanf("%lf", p + i);
for (int i = 0; i < n; ++ i)
for (int j = 0; j < n; ++ j) {
int pi(i * n + j);
for (int k = 0; k < n; ++ k)
for (int l = 0; l < n; ++ l) {
int pj(k * n + l);
if (k != l)
a[pi][pj] = transPsb(k, i) * transPsb(l, j);
else
a[pi][pj] = 0;
}
if (i == pa && j == pb)
a[pi][t] = 1.0;
else
a[pi][t] = 0;
a[pi][pi] -= 1.0;
}
guess();
for (int i = 0; i < n; ++ i)
printf("%.6lf ", s[n * i + i]);
putchar(10);
}