#include <bits/stdc++.h>
using namespace std;
const int N = 50;
const int M = (N - 1) * N >> 1;
int n, m, S, T, du[N], adj[N], e;
double A[M][M], p[N], k[N], ans[N];
struct node {
  int qi, zhong, next;
} s[M << 1];
inline void add(int qi, int zhong) {
  s[++e].zhong = zhong;
  s[e].qi = qi;
  s[e].next = adj[qi];
  adj[qi] = e;
}
int num[N][N], cnt, f[N];
inline void gasse() {
  for (int i = 1; i <= cnt; i++) {
    int p = i;
    for (int j = i + 1; j <= cnt; j++)
      if (fabs(A[p][i]) < fabs(A[j][i])) p = j;
    if (p != i)
      for (int j = 1; j <= cnt + 1; j++) swap(A[i][j], A[p][j]);
    for (int j = i + 1; j <= cnt; j++) {
      double tmp = A[j][i] / A[i][i];
      for (int k = i; k <= cnt + 1; k++) A[j][k] -= tmp * A[i][k];
    }
  }
  for (int i = cnt; i >= 1; i--) {
    for (int j = i + 1; j <= cnt; j++) A[i][cnt + 1] -= A[j][cnt + 1] * A[i][j];
    A[i][cnt + 1] /= A[i][i];
  }
}
int main() {
  scanf("%d%d%d%d", &n, &m, &S, &T);
  for (int i = 1; i <= m; i++) {
    int a, b;
    scanf("%d%d", &a, &b);
    add(a, b), add(b, a), du[a]++, du[b]++;
  }
  for (int i = 1; i <= n; i++) scanf("%lf", &p[i]), k[i] = (1.0 - p[i]) / du[i];
  if (S == T) {
    for (int i = 1; i <= n; i++)
      printf("%.10lf%c", i == S ? 1.0 : 0.0, i == n ? '\n' : ' ');
    return 0;
  }
  for (int i = 1; i <= n; i++)
    for (int j = 1; j <= n; j++)
      if (i != j) num[i][j] = ++cnt;
  for (int t = 1; t <= n; t++) {
    memset(f, 0, sizeof(f));
    f[t] = 1;
    for (int i = 1; i < M; i++)
      for (int j = 1; j < M; j++) A[i][j] = 0;
    for (int i = 1; i <= n; i++)
      for (int j = 1; j <= n; j++) {
        if (i == j) continue;
        int nu = num[i][j];
        A[nu][nu] = 1.0 - p[i] * p[j];
        for (int a = adj[i]; a; a = s[a].next) {
          int u = s[a].zhong;
          int nui = num[u][j];
          if (u == j)
            A[nu][cnt + 1] += k[i] * p[j] * f[j];
          else
            A[nu][nui] -= k[i] * p[j];
        }
        for (int b = adj[j]; b; b = s[b].next) {
          int v = s[b].zhong;
          int nui = num[i][v];
          if (i == v)
            A[nu][cnt + 1] += p[i] * k[j] * f[i];
          else
            A[nu][nui] -= p[i] * k[j];
        }
        for (int a = adj[i]; a; a = s[a].next)
          for (int b = adj[j]; b; b = s[b].next) {
            int u = s[a].zhong, v = s[b].zhong;
            int nui = num[u][v];
            if (u == v)
              A[nu][cnt + 1] += k[i] * k[j] * f[u];
            else
              A[nu][nui] -= k[i] * k[j];
          }
      }
    gasse();
    ans[t] = A[num[S][T]][cnt + 1];
  }
  printf("%.10lf", ans[1]);
  for (int i = 2; i <= n; i++) printf(" %.10lf", ans[i]);
}
