#include <bits/stdc++.h>
using namespace std;
int Get() {
  char c;
  while (c = getchar(), c < '0' || c > '9')
    ;
  int X = c - 48;
  while (c = getchar(), c >= '0' && c <= '9') X = X * 10 + c - 48;
  return X;
}
const double eps = 1e-7;
int F(int A, int B) {
  if (A > B) swap(A, B);
  return B * (B + 1) / 2 + A;
}
int main() {
  int N = Get(), M = Get(), A = Get() - 1, B = Get() - 1;
  static int Degree[22];
  memset(Degree, 0, sizeof(Degree));
  static bool G[22][22];
  for (int i = 0; i < M; i++) {
    int X = Get() - 1, Y = Get() - 1;
    Degree[X]++;
    Degree[Y]++;
    G[X][Y] = G[Y][X] = true;
  }
  static double P[22][22];
  for (int i = 0; i < N; i++) {
    scanf("%lf", &P[i][i]);
    for (int j = 0; j < N; j++)
      if (G[i][j]) P[i][j] = (1 - P[i][i]) / Degree[i];
  }
  for (int T = 0; T < N; T++) {
    static double G[253][253], C[253];
    memset(G, 0, sizeof(G));
    memset(C, 0, sizeof(C));
    for (int i = 0; i < N; i++)
      for (int j = i; j < N; j++) {
        G[F(i, j)][F(i, j)] = 1;
        if (i == j) {
          C[F(i, j)] = (i == T) ? 1 : 0;
          continue;
        }
        for (int x = 0; x < N; x++)
          for (int y = 0; y < N; y++) G[F(i, j)][F(x, y)] -= P[i][x] * P[j][y];
      }
    int Total = N * (N + 1) / 2;
    for (int i = 0; i < Total; i++) {
      int P = i;
      while (fabs(G[P][i]) < eps) P++;
      if (P != i) {
        for (int j = i; j < Total; j++) swap(G[i][j], G[P][j]);
        swap(C[P], C[i]);
      }
      for (int j = i + 1; j < Total; j++) {
        double T = G[j][i] / G[i][i];
        for (int k = i; k < Total; k++) G[j][k] -= T * G[i][k];
        C[j] -= T * C[i];
      }
    }
    for (int i = Total - 1; i >= 0; i--) {
      double X = C[i] / G[i][i];
      if (i == F(A, B)) {
        printf("%0.10lf", X);
        break;
      }
      for (int j = 0; j < i; j++) C[j] -= X * G[j][i];
    }
    putchar((T == N - 1) ? '\n' : ' ');
  }
  return 0;
}
