#include <bits/stdc++.h>
using namespace std;
const double eps = 1e-11;
double a[544][544], cp;
bool Gauss(int len) {
  for (int i = 1; i <= len; ++i) {
    int k = i;
    while (k <= len && fabs(a[k][i]) < eps) k++;
    if (k > len) continue;
    if (k != i) swap(a[k], a[i]);
    for (int k = 1; k <= len; ++k)
      if (k != i) {
        cp = a[k][i] / a[i][i];
        for (int j = i; j <= len + 1; ++j) a[k][j] -= cp * a[i][j];
      }
  }
  return 0;
}
int n, m, x, y;
int T[55][505], cnt[55];
double stay[55];
int getid(int a, int b) { return (a - 1) * n + b; }
void Build_Tree(int aa, int b) {
  if (x == aa && y == b) a[getid(aa, b)][n * n + 1] = -1;
  a[getid(aa, b)][getid(aa, b)] = -1;
  for (int i = 1; i <= cnt[aa]; ++i)
    for (int j = 1; j <= cnt[b]; ++j) {
      int u = T[aa][i], v = T[b][j];
      if (u == v) continue;
      double p1, p2;
      if (u == aa)
        p1 = stay[u];
      else
        p1 = (1 - stay[u]) / (cnt[u] - 1);
      if (v == b)
        p2 = stay[v];
      else
        p2 = (1 - stay[v]) / (cnt[v] - 1);
      a[getid(aa, b)][getid(u, v)] += p1 * p2;
    }
}
int main() {
  scanf("%d%d%d%d", &n, &m, &x, &y);
  for (int i = 1; i <= m; ++i) {
    int x, y;
    scanf("%d%d", &x, &y);
    T[x][++cnt[x]] = y;
    T[y][++cnt[y]] = x;
  }
  for (int i = 1; i <= n; ++i) scanf("%lf", &stay[i]), T[i][++cnt[i]] = i;
  for (int i = 1; i <= n; ++i)
    for (int j = 1; j <= n; ++j) Build_Tree(i, j);
  Gauss(n * n);
  for (int i = 1; i <= n; ++i)
    printf("%.6lf ", a[getid(i, i)][n * n + 1] / a[getid(i, i)][getid(i, i)]);
}
