#include <bits/stdc++.h>
using namespace std;
inline int read() {
  char c = getchar();
  while (c < '0' || c > '9') c = getchar();
  int sum = 0;
  while ('0' <= c && c <= '9') sum = sum * 10 + c - 48, c = getchar();
  return sum;
}
const double eps = 1e-7;
const int maxn = 25, maxm = maxn * maxn;
int n, m, a, b, d[maxn], id[maxn][maxn];
vector<int> G[maxn];
double p[maxn], mat[maxm][maxm], ans[maxm], f[maxn][maxn];
void init() {
  m = 0;
  for (int i = 1; i <= n; ++i)
    for (int j = 1; j <= n; ++j) id[i][j] = ++m;
  mat[id[a][b]][m + 1] = -1;
  for (int i = 1; i <= n; i++)
    for (int j = 1; j <= n; j++) {
      int x = id[i][j];
      --mat[x][x];
      if (i != j) mat[x][x] += p[i] * p[j];
      for (int u : G[i])
        for (int v : G[j]) {
          if (u == v) continue;
          mat[x][id[u][v]] = (1 - p[u]) * (1 - p[v]) / (d[u] * d[v]);
        }
      for (int u : G[i]) {
        if (u == j) continue;
        mat[x][id[u][j]] = (1 - p[u]) * p[j] / d[u];
      }
      for (int v : G[j]) {
        if (v == i) continue;
        mat[x][id[i][v]] = (1 - p[v]) * p[i] / d[v];
      }
    }
}
inline void gauss() {
  for (int i = 1; i <= m; i++) {
    int p = i;
    for (int j = i; j <= m; j++)
      if (abs(mat[j][i]) > abs(mat[p][i])) p = j;
    if (p != i)
      for (int j = i; j <= m; j++) swap(mat[p][j], mat[i][j]);
    for (int j = 1; j <= m; j++) {
      if (p == j) continue;
      double t = mat[j][i] / mat[i][i];
      for (int k = i; k <= m + 1; k++) mat[j][k] -= mat[i][k] * t;
    }
  }
  for (int i = 1; i <= n; i++)
    for (int j = 1; j <= n; j++)
      f[i][j] = mat[id[i][j]][m + 1] / mat[id[i][j]][id[i][j]];
}
int main() {
  n = read();
  m = read();
  a = read();
  b = read();
  for (int i = 1, u, v; i <= m; i++) {
    u = read();
    v = read();
    G[u].push_back(v);
    d[u]++;
    G[v].push_back(u);
    d[v]++;
  }
  for (int i = 1; i <= n; ++i) scanf("%lf", &p[i]);
  init();
  gauss();
  for (int i = 1; i <= n; i++) printf("%.10lf ", f[i][i]);
  return 0;
}
