#include <bits/stdc++.h>
using namespace std;
const int mxn = 505;
struct mat {
  double a[mxn][mxn];
};
inline mat inverse(mat a) {
  mat b;
  for (int i = 0; i < mxn; ++i)
    for (int j = 0; j < mxn; ++j) b.a[i][j] = ((i == j) ? 1 : 0);
  for (int i = 0; i < mxn; ++i) {
    int x = i;
    for (int j = i; j < mxn; ++j)
      if (abs(a.a[j][i]) > abs(a.a[x][i])) x = j;
    if (x != i) {
      for (int j = 0; j < mxn; ++j) swap(a.a[i][j], a.a[x][j]);
      for (int j = 0; j < mxn; ++j) swap(b.a[i][j], b.a[x][j]);
    }
    double p = a.a[i][i];
    for (int j = 0; j < mxn; ++j) a.a[i][j] /= p, b.a[i][j] /= p;
    for (int j = 0; j < mxn; ++j)
      if (j != i) {
        p = -a.a[j][i];
        for (int k = 0; k < mxn; ++k) a.a[j][k] += a.a[i][k] * p;
        for (int k = 0; k < mxn; ++k) b.a[j][k] += b.a[i][k] * p;
      }
  }
  return b;
}
double stay[30], p[30][30];
bool graph[30][30];
int main() {
  int n, m, A, B, x, y;
  scanf("%d%d%d%d", &n, &m, &A, &B), --A, --B;
  for (; m--;) scanf("%d%d", &x, &y), --x, --y, graph[x][y] = graph[y][x] = 1;
  for (int i = 0; i < n; ++i) scanf("%lf", stay + i);
  if (n == 1) {
    printf("1.0");
    return 0;
  }
  for (int i = 0; i < n; ++i) {
    int deg = 0;
    for (int j = 0; j < n; ++j)
      if (graph[i][j]) ++deg;
    p[i][i] = stay[i];
    for (int j = 0; j < n; ++j)
      if (graph[i][j]) p[i][j] = (1.0 - stay[i]) / deg;
  }
  mat a;
  for (int i = 0; i < mxn; ++i)
    for (int j = 0; j < mxn; ++j) a.a[i][j] = ((i == j) ? 1.0 : 0.0);
  for (int i = 0; i < n; ++i)
    for (int j = 0; j < n; ++j)
      if (i != j)
        for (int k = 0; k < n; ++k)
          for (int l = 0; l < n; ++l)
            a.a[i * n + j][k * n + l] -= p[i][k] * p[j][l];
  mat b = inverse(a);
  for (int i = 0; i < n; ++i) printf("%.6f ", b.a[A * n + B][i * n + i]);
  puts("");
}
