#include <bits/stdc++.h>
using namespace std;
const int maxn = 30;
const int maxN = 510;
const double eps = 1e-8;
int n, m, A, B, cnt;
double p[maxn];
struct Edge {
  int nxt, to;
} e[maxn * maxn * 2];
int hd[maxn], ecnt = -1, du[maxn];
inline void addEdge(int x, int y) {
  ++du[x];
  e[++ecnt] = (Edge){hd[x], y};
  hd[x] = ecnt;
}
inline int N(int x, int y) { return (x - 1) * n + y; }
double f[maxN][maxN], ans[maxN];
inline void init() {
  f[N(A, B)][cnt + 1] = 1;
  for (int i = 1; i <= n; i++)
    for (int j = 1; j <= n; j++) {
      int u = N(i, j);
      f[u][u] = 1;
      if (i ^ j) f[u][u] -= p[i] * p[j];
      for (int k = hd[j], v; ~k; k = e[k].nxt)
        if ((v = e[k].to) ^ i) f[u][N(i, v)] -= p[i] * (1 - p[v]) / du[v];
      for (int k = hd[i], v; ~k; k = e[k].nxt)
        if ((v = e[k].to) ^ j) f[u][N(v, j)] -= p[j] * (1 - p[v]) / du[v];
      for (int k = hd[i], v1; ~k; k = e[k].nxt)
        for (int h = hd[j], v2; ~h; h = e[h].nxt)
          if ((v1 = e[k].to) ^ (v2 = e[h].to))
            f[u][N(v1, v2)] -= (1 - p[v1]) * (1 - p[v2]) / du[v1] / du[v2];
    }
}
inline void Gauss() {
  for (int i = 1; i <= cnt; i++) {
    int pos = i;
    for (int j = i + 1; j <= cnt; j++)
      if (fabs(f[j][i]) > fabs(f[pos][i])) pos = j;
    if (pos ^ i) swap(f[pos], f[i]);
    if (fabs(f[i][i]) < eps) continue;
    double tp = f[i][i];
    for (int j = i; j <= cnt + 1; j++) f[i][j] /= tp;
    for (int j = i + 1; j <= cnt; j++) {
      double tp = f[j][i];
      for (int k = i; k <= cnt + 1; ++k) f[j][k] -= tp * f[i][k];
    }
  }
  for (int i = cnt; i; i--) {
    ans[i] = f[i][cnt + 1];
    for (int j = i - 1; j; j--) f[j][cnt + 1] -= f[j][i] * ans[i];
  }
}
int main() {
  memset(hd, -1, sizeof hd);
  cin >> n >> m >> A >> B;
  cnt = n * n;
  for (int i = 1, x, y; i <= m; i++) {
    cin >> x >> y;
    addEdge(x, y), addEdge(y, x);
  }
  for (int i = 1; i <= n; i++) cin >> p[i];
  init();
  Gauss();
  for (int i = 1; i <= n; i++) printf("%.8f\n", ans[N(i, i)]);
  return 0;
}
