#include <bits/stdc++.h>
using namespace std;
struct Edge {
  int from, to, next;
} edge[1001];
int ID[31][31], Head[31], D[31], n, m, k1, k2, a, b, I_cnt, E_cnt;
double A[501][501], s1[31];
void Gauss();
void add(int U, int V);
int main() {
  scanf("%d%d%d%d", &n, &m, &k1, &k2);
  for (int i = 1; i <= m; i++) {
    scanf("%d%d", &a, &b);
    D[a]++;
    D[b]++;
    add(a, b);
    add(b, a);
  }
  for (int i = 1; i <= n; i++) {
    scanf("%lf", &s1[i]);
  }
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= n; j++) {
      I_cnt++;
      ID[i][j] = I_cnt;
    }
  }
  A[ID[k1][k2]][I_cnt + 1] = -1;
  int id, x, y;
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= n; j++) {
      id = ID[i][j];
      A[id][id]--;
      if (i != j) {
        A[id][id] += s1[i] * s1[j];
      }
      for (int k = Head[i]; k; k = edge[k].next) {
        x = edge[k].to;
        for (int g = Head[j]; g; g = edge[g].next) {
          y = edge[g].to;
          if (x == y) {
            continue;
          }
          A[id][ID[x][y]] =
              (1.0 - s1[x]) * (1.0 - s1[y]) / (double)D[x] / (double)D[y];
        }
      }
      for (int k = Head[i]; k; k = edge[k].next) {
        x = edge[k].to;
        if (x == j) {
          continue;
        }
        A[id][ID[x][j]] = (1.0 - s1[x]) * s1[j] / (double)D[x];
      }
      for (int k = Head[j]; k; k = edge[k].next) {
        x = edge[k].to;
        if (x == i) {
          continue;
        }
        A[id][ID[i][x]] = (1.0 - s1[x]) * s1[i] / (double)D[x];
      }
    }
  }
  Gauss();
  for (int i = 1; i <= n; i++) {
    printf("%0.10lf ", A[ID[i][i]][I_cnt + 1] / A[ID[i][i]][ID[i][i]]);
  }
  return 0;
}
void Gauss() {
  int T1;
  double T2;
  for (int i = 1; i <= I_cnt; i++) {
    T1 = i;
    for (int j = i + 1; j <= I_cnt; j++) {
      if (fabs(A[j][i]) > fabs(A[T1][i])) {
        T1 = j;
      }
    }
    if (T1 != i) {
      swap(A[T1], A[i]);
    }
    for (int j = 1; j <= I_cnt; j++) {
      if (j == T1) {
        continue;
      }
      T2 = A[j][i] / A[i][i];
      for (int k = i + 1; k <= I_cnt + 1; k++) {
        A[j][k] -= A[i][k] * T2;
      }
    }
  }
  return;
}
void add(int U, int V) {
  E_cnt++;
  edge[E_cnt].from = U;
  edge[E_cnt].to = V;
  edge[E_cnt].next = Head[U];
  Head[U] = E_cnt;
  return;
}
