#include <bits/stdc++.h>
using namespace std;
template <class T>
T gcd(T a, T b) {
  return b ? gcd(b, a % b) : a;
}
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
const double EPS = 1e-9;
const double PI = acos(-1.);
const long long LL_INF = 1e17 + 16;
const int INF = 1e9 + 10;
const long long MOD = 1e9 + 7;
const int MAXN = 23;
int g[MAXN][MAXN];
double p[MAXN];
double m[MAXN * MAXN][MAXN * MAXN];
int ind[MAXN][MAXN], ind1[MAXN][MAXN];
int ii[MAXN * MAXN], jj[MAXN * MAXN];
int deg[MAXN];
void build_matr(int n) {
  for (int i = (0); i < (int)(n); i++) {
    for (int j = (0); j < (int)(n); j++) {
      if (i != j) {
        m[ind[i][j]][ind[i][j]] = 1. - p[i] * p[j];
      }
    }
  }
  for (int i = (0); i < (int)(n); i++) {
    for (int j = (0); j < (int)(n); j++) {
      if (i != j) {
        for (int i1 = (0); i1 < (int)(n); i1++) {
          if (g[i][i1]) {
            m[ind[i][j]][ind[i1][j]] = -(1. - p[i]) / deg[i] * p[j];
          }
        }
        for (int j1 = (0); j1 < (int)(n); j1++) {
          if (g[j][j1]) {
            m[ind[i][j]][ind[i][j1]] = -p[i] * (1. - p[j]) / deg[j];
          }
        }
        for (int i1 = (0); i1 < (int)(n); i1++) {
          for (int j1 = (0); j1 < (int)(n); j1++) {
            if (g[i][i1] && g[j][j1]) {
              m[ind[i][j]][ind[i1][j1]] =
                  -(1. - p[i]) / deg[i] * (1. - p[j]) / deg[j];
            }
          }
        }
      }
    }
  }
}
void go(int n) {
  for (int k = (0); k < (int)(n * (n - 1)); k++) {
    int pos = k;
    for (int i = (k); i < (int)(n * (n - 1)); i++) {
      if (abs(m[i][k]) > abs(m[pos][k])) {
        pos = i;
      }
    }
    pos = k;
    if (pos != k) {
      swap(ii[pos], ii[k]);
      swap(jj[pos], jj[k]);
      for (int j = (k); j < (int)(n * n); j++) {
        swap(m[pos][j], m[k][j]);
      }
    }
    for (int i = (k + 1); i < (int)(n * (n - 1)); i++) {
      for (int j = (k + 1); j < (int)(n * n); j++) {
        m[i][j] -= m[i][k] / m[pos][k] * m[pos][j];
      }
      m[i][k] = 0;
    }
  }
}
double ans[MAXN];
double b[MAXN * MAXN];
double res[MAXN * MAXN];
void eval(int n, int pos, int s, int f) {
  for (int i = (0); i < (int)(n * (n - 1)); i++) {
    b[i] = -m[i][n * (n - 1) + pos];
  }
  for (int i = n * (n - 1) - 1; i >= 0; i--) {
    res[i] = b[i] / m[i][i];
    for (int k = i - 1; k >= 0; k--) {
      b[k] -= res[i] * m[k][i];
    }
  }
  for (int i = (0); i < (int)(n * n); i++) {
    if (ii[i] == s && jj[i] == f) {
      ans[pos] = res[i];
    }
  }
}
void solve() {
  int n, m, s, f;
  scanf("%d%d%d%d", &n, &m, &s, &f);
  s--, f--;
  if (s == f) {
    for (int i = (0); i < (int)(n); i++) {
      if (i == s) {
        printf("1.0 ");
      } else {
        printf("0.0 ");
      }
    }
    putchar('\n');
    return;
  }
  for (int i = (0); i < (int)(m); i++) {
    int a, b;
    scanf("%d%d", &a, &b);
    a--, b--;
    g[a][b] = g[b][a] = 1;
    deg[a]++;
    deg[b]++;
  }
  for (int i = (0); i < (int)(n); i++) {
    double x;
    scanf("%lf", &x);
    p[i] = x;
  }
  int top = 0;
  for (int i = (0); i < (int)(n); i++) {
    for (int j = (0); j < (int)(n); j++) {
      if (i != j) {
        ii[top] = i;
        jj[top] = j;
        ind[i][j] = top++;
      }
    }
  }
  for (int i = (0); i < (int)(n); i++) {
    ii[top] = i;
    jj[top] = i;
    ind[i][i] = top++;
  }
  build_matr(n);
  go(n);
  for (int i = (0); i < (int)(n); i++) {
    eval(n, i, s, f);
  }
  for (int i = (0); i < (int)(n); i++) {
    printf("%.12lf\n", (double)ans[i]);
  }
}
int main() {
  int t = 1;
  while (t--) {
    solve();
  }
}
