#include <bits/stdc++.h>
using namespace std;
const double pi = acos(-1.0);
const long double eps = 1e-8;
const int INF = 0x3f3f3f3f;
const long long LINF = 0x3f3f3f3f3f3f3f3f;
const int MX = 25 + 7;
const int maxbit = 30;
const int mod = 1e9 + 7;
long long gcd(long long a, long long b) { return b ? gcd(b, a % b) : a; }
long long quimod(long long a, long long k) {
  long long res = 1;
  while (k) {
    if (k & 1) res = (res * a) % mod;
    a = (a * a) % mod;
    k >>= 1;
  }
  return res;
}
long long lcm(long long a, long long b) { return a / gcd(a, b) * b; }
int n, m, A, B, cnt;
double p[MX];
inline int F(int x, int y) { return (x - 1) * n + y; }
struct Edge {
  int v, next;
} e[2 * MX * MX];
int head[MX], ecnt, deg[MX];
void add(int u, int v) {
  deg[u]++;
  e[++ecnt].v = v;
  e[ecnt].next = head[u];
  head[u] = ecnt;
}
double f[MX * MX][MX * MX];
void build() {
  cnt = n * n;
  f[F(A, B)][cnt + 1] = 1;
  for (int i = 1; i <= n; ++i) {
    for (int j = 1; j <= n; ++j) {
      int u = F(i, j);
      f[u][u] = 1;
      if (i != j) f[u][u] -= (p[i] * p[j]);
      for (int k = head[j]; k; k = e[k].next) {
        int v = e[k].v;
        if (v != i) f[u][F(i, v)] -= p[i] * (1 - p[v]) / deg[v];
      }
      for (int k = head[i]; k; k = e[k].next) {
        int v = e[k].v;
        if (v != j) f[u][F(v, j)] -= p[j] * (1 - p[v]) / deg[v];
      }
      for (int k = head[i]; k; k = e[k].next) {
        for (int h = head[j]; h; h = e[h].next) {
          int v1 = e[k].v, v2 = e[h].v;
          if (v1 != v2)
            f[u][F(v1, v2)] -=
                (1 - p[v1]) * (1 - p[v2]) / (1.0 * deg[v1] * deg[v2]);
        }
      }
    }
  }
}
double ans[MX * MX];
void Gauss() {
  for (int i = 1; i <= cnt; ++i) {
    int r = i;
    for (int j = i + 1; j <= cnt; ++j)
      if (fabs(f[r][i]) < fabs(f[j][i])) r = j;
    if (fabs(f[r][i]) < eps) continue;
    if (i != r) swap(f[i], f[r]);
    double div = f[i][i];
    for (int j = i; j <= cnt + 1; ++j) f[i][j] /= div;
    for (int j = i + 1; j <= cnt; ++j) {
      div = f[j][i];
      for (int k = i; k <= cnt + 1; ++k) f[j][k] -= f[i][k] * div;
    }
  }
  ans[cnt] = f[cnt][cnt + 1];
  for (int i = cnt - 1; i; --i) {
    ans[i] = f[i][cnt + 1];
    for (int j = i + 1; j <= cnt; ++j) ans[i] -= (f[i][j] * ans[j]);
  }
}
int main() {
  scanf("%d %d %d %d", &n, &m, &A, &B);
  for (int i = 1; i <= m; ++i) {
    int u, v;
    scanf("%d %d", &u, &v);
    add(u, v);
    add(v, u);
  }
  for (int i = 1; i <= n; ++i) scanf("%lf", &p[i]);
  build();
  Gauss();
  for (int i = 1; i <= n; ++i)
    printf("%.6f%c", ans[F(i, i)], (i == n) ? '\n' : ' ');
  return 0;
}
