#include <bits/stdc++.h>
using namespace std;
double myabs(double a) {
  if (a < 0) return -a;
  return a;
}
const int N = 490;
const double lip = 1e-8;
double a[N][N];
bool flag[N][N];
int du[N];
double p[N];
int n, m;
int num(int a, int b) { return n * (a - 1) + b; }
void Gaus() {
  bool flag = false;
  for (int i = 1; i <= n * n; i++) {
    if (myabs(a[i][i]) <= lip)
      for (int j = i + 1; j <= n * n; j++)
        if (myabs(a[j][i]) >= lip) {
          swap(a[i], a[j]);
          break;
        }
    for (int j = 1; j <= n * n; j++) {
      if (i == j) continue;
      double num = a[j][i] / a[i][i];
      for (int k = 1; k <= n * n + 1; k++) a[j][k] -= a[i][k] * num;
    }
  }
  for (int i = 1; i <= n; i++)
    printf("%.10lf ", a[num(i, i)][n * n + 1] / a[num(i, i)][num(i, i)]);
}
int main() {
  int s, t;
  cin >> n >> m >> s >> t;
  for (int i = 1; i <= m; i++) {
    int x, y;
    scanf("%d %d", &x, &y);
    flag[x][y] = flag[y][x] = true;
    du[x]++;
    du[y]++;
  }
  for (int i = 1; i <= n; i++) scanf("%lf", &p[i]);
  a[num(s, t)][n * n + 1] = -1;
  for (int i = 1; i <= n; i++)
    for (int j = 1; j <= n; j++) {
      a[num(i, j)][num(i, j)] = -1;
      if (i != j) a[num(i, j)][num(i, j)] += p[i] * p[j];
      for (int k = 1; k <= n; k++)
        if (flag[i][k] && k != j)
          a[num(i, j)][num(k, j)] += p[j] * (1 - p[k]) / du[k];
      for (int l = 1; l <= n; l++)
        if (flag[j][l] && l != i)
          a[num(i, j)][num(i, l)] += p[i] * (1 - p[l]) / du[l];
      for (int k = 1; k <= n; k++)
        if (flag[i][k])
          for (int l = 1; l <= n; l++)
            if (flag[j][l] && k != l)
              a[num(i, j)][num(k, l)] +=
                  (1 - p[k]) / du[k] * (1 - p[l]) / du[l];
    }
  Gaus();
  return 0;
}
