#include <bits/stdc++.h>
void Get(int &T) {
  char C;
  bool F = 0;
  for (; C = getchar(), C < '0' || C > '9';)
    if (C == '-') F = 1;
  for (T = C - '0'; C = getchar(), C >= '0' && C <= '9'; T = T * 10 + C - '0')
    ;
  F && (T = -T);
}
int N, M, X, Y;
int G[25][25];
int D[25];
double P[25];
void Init() {
  Get(N);
  Get(M);
  Get(X);
  Get(Y);
  for (int i = 1, U, V; i <= M; i++) {
    Get(U);
    Get(V);
    G[U][V] = G[V][U] = 1;
    D[U]++;
    D[V]++;
  }
  for (int i = 1; i <= N; i++) scanf("%lf", &P[i]);
}
double A[505][1005];
double Prob(int X, int Y) {
  if (X == Y) return P[X];
  if (G[X][Y] == 0) return 0;
  return (1 - P[X]) / D[X];
}
double Abs(double X) { return X > 0 ? X : -X; }
void Gauss(int N) {
  for (int i = 1; i <= N; i++) {
    int Choose = i;
    for (int j = i + 1; j <= N; j++)
      if (Abs(A[j][i]) > Abs(A[Choose][i])) Choose = j;
    if (Choose != i)
      for (int j = i; j <= N + N; j++) std::swap(A[Choose][j], A[i][j]);
    double K = 1 / A[i][i];
    for (int k = i; k <= N + N; k++) A[i][k] *= K;
    for (int j = i + 1; j <= N; j++) {
      double K = A[j][i];
      for (int k = i; k <= N + N; k++) {
        A[j][k] -= K * A[i][k];
      }
    }
  }
  for (int i = N; i >= 1; i--) {
    for (int j = i - 1; j >= 1; j--) {
      double K = A[j][i];
      for (int k = i; k <= N + N; k++) {
        A[j][k] -= A[i][k] * K;
      }
    }
  }
}
double Z[505][1005];
void Mul(double X[][1005], double Y[][1005], int N, int M, int K) {
  for (int i = 1; i <= N; i++)
    for (int j = 1; j <= M; j++) {
      Z[i][j] = 0;
      for (int k = 1; k <= K; k++) Z[i][j] += X[i][k] * Y[k][j];
    }
  for (int i = 1; i <= N; i++)
    for (int j = 1; j <= M; j++) X[i][j] = Z[i][j];
}
void Work() {
  for (int i = 1; i <= N; i++)
    for (int j = 1; j <= N; j++) {
      if (i == j)
        A[((i - 1) * N + j)][((i - 1) * N + j)] = 1;
      else {
        for (int p = 1; p <= N; p++)
          for (int q = 1; q <= N; q++) {
            A[((i - 1) * N + j)][((p - 1) * N + q)] += Prob(i, p) * Prob(j, q);
          }
        A[((i - 1) * N + j)][((i - 1) * N + j)] -= 1;
      }
    }
  for (int i = 1; i <= N; i++)
    for (int j = 1; j <= N; j++)
      A[((i - 1) * N + j)][((i - 1) * N + j) + N * N] = 1;
  Gauss(N * N);
  for (int i = 1; i <= N * N; i++) {
    for (int j = 1; j <= N * N; j++) A[i][j] = A[i][j + N * N];
  }
}
void Output() {
  for (int i = 1; i <= N; i++)
    printf("%.9lf\n", A[((X - 1) * N + Y)][((i - 1) * N + i)]);
}
int main() {
  Init();
  Work();
  Output();
  return 0;
}
