#include <bits/stdc++.h>
using namespace std;
struct matrix {
  double a[500][500];
};
matrix inverse(matrix A) {
  int i, j, k;
  matrix B;
  for ((i) = 0; (i) < (int)(500); (i)++)
    for ((j) = 0; (j) < (int)(500); (j)++) B.a[i][j] = ((i == j) ? 1.0 : 0.0);
  for ((i) = 0; (i) < (int)(500); (i)++) {
    int x = i;
    for (j = i; j < 500; j++)
      if (((A.a[j][i]) > 0 ? (A.a[j][i]) : -(A.a[j][i])) >
          ((A.a[x][i]) > 0 ? (A.a[x][i]) : -(A.a[x][i])))
        x = j;
    if (x != i) {
      for ((j) = 0; (j) < (int)(500); (j)++) swap(A.a[i][j], A.a[x][j]);
      for ((j) = 0; (j) < (int)(500); (j)++) swap(B.a[i][j], B.a[x][j]);
    }
    double p = A.a[i][i];
    for ((j) = 0; (j) < (int)(500); (j)++) {
      A.a[i][j] /= p;
      B.a[i][j] /= p;
    }
    for ((j) = 0; (j) < (int)(500); (j)++)
      if (j != i) {
        p = -A.a[j][i];
        for ((k) = 0; (k) < (int)(500); (k)++) A.a[j][k] += A.a[i][k] * p;
        for ((k) = 0; (k) < (int)(500); (k)++) B.a[j][k] += B.a[i][k] * p;
      }
  }
  return B;
}
double stay[30];
bool graph[30][30];
double p[30][30];
int main(void) {
  int N, M, i, j, k, l, a, b, x, y;
  cin >> N >> M >> a >> b;
  a--;
  b--;
  for ((i) = 0; (i) < (int)(M); (i)++) {
    cin >> x >> y;
    x--;
    y--;
    graph[x][y] = graph[y][x] = true;
  }
  for ((i) = 0; (i) < (int)(N); (i)++) cin >> stay[i];
  if (N == 1) {
    cout << 1.0 << endl;
    return 0;
  }
  for ((i) = 0; (i) < (int)(N); (i)++) {
    int deg = 0;
    for ((j) = 0; (j) < (int)(N); (j)++)
      if (graph[i][j]) deg++;
    p[i][i] = stay[i];
    for ((j) = 0; (j) < (int)(N); (j)++)
      if (graph[i][j]) p[i][j] = (1.0 - stay[i]) / deg;
  }
  matrix A;
  for ((i) = 0; (i) < (int)(500); (i)++)
    for ((j) = 0; (j) < (int)(500); (j)++) A.a[i][j] = ((i == j) ? 1.0 : 0.0);
  for ((i) = 0; (i) < (int)(N); (i)++)
    for ((j) = 0; (j) < (int)(N); (j)++)
      if (i != j)
        for ((k) = 0; (k) < (int)(N); (k)++)
          for ((l) = 0; (l) < (int)(N); (l)++)
            A.a[i * N + j][k * N + l] -= p[i][k] * p[j][l];
  matrix B = inverse(A);
  int start = a * N + b;
  for ((i) = 0; (i) < (int)(N); (i)++) {
    double ans = B.a[start][i * N + i];
    printf("%.9f", ans);
    if (i == N - 1)
      printf("\n");
    else
      printf(" ");
  }
  return 0;
}
