#include <bits/stdc++.h>
using namespace std;
const int MAXN = 22;
const double EPS = 1e-12;
int n, m, a, b, u, v, tot;
vector<int> g[MAXN + 5];
int degree[MAXN + 5];
double p[MAXN + 5];
double A[MAXN * MAXN + 5][MAXN * MAXN + 5], B[MAXN * MAXN + 5][MAXN * MAXN + 5],
    X[MAXN * MAXN + 5][MAXN + 5];
int idx[MAXN + 5][MAXN + 5];
int dcmp(double x) {
  if (fabs(x) < EPS) return 0;
  return x < 0 ? -1 : 1;
}
int getidx(int i, int j) {
  if (i > j) swap(i, j);
  return idx[i][j];
}
void getA() {
  for (int i = 1; i <= n; ++i)
    for (int j = i; j <= n; ++j) idx[i][j] = ++tot;
  for (int i = 1; i <= n; ++i) {
    A[idx[i][i]][idx[i][i]] = 1;
    for (int j = i + 1; j <= n; ++j) {
      int u = getidx(i, j);
      A[u][u] += 1 - p[i] * p[j];
      for (int x = 0; x < g[i].size(); ++x) {
        int w = g[i][x];
        int v = getidx(j, w);
        A[u][v] += -(1 - p[i]) / degree[i] * p[j];
      }
      for (int y = 0; y < g[j].size(); ++y) {
        int w = g[j][y];
        int v = getidx(i, w);
        A[u][v] += -p[i] * (1 - p[j]) / degree[j];
      }
      for (int x = 0; x < g[i].size(); ++x)
        for (int y = 0; y < g[j].size(); ++y) {
          int w1 = g[i][x];
          int w2 = g[j][y];
          int v = getidx(w1, w2);
          A[u][v] += -(1 - p[i]) / degree[i] * (1 - p[j]) / degree[j];
        }
    }
  }
}
void getB() {
  for (int i = 1; i <= n; ++i) B[getidx(i, i)][i] = 1;
}
void print() {
  for (int i = 1; i <= tot; ++i) {
    for (int j = 1; j <= tot; ++j) printf("%.2lf ", A[i][j]);
    for (int j = 1; j <= n; ++j) printf("%.2lf ", B[i][j]);
    printf("\n");
  }
}
void gauss() {
  int r, c;
  for (r = 1, c = 1; r <= tot && c <= tot; ++r, ++c) {
    int maxr = r;
    for (int i = r + 1; i <= tot; ++i)
      if (dcmp(fabs(A[i][c]) - fabs(A[maxr][c])) > 0) maxr = i;
    if (dcmp(A[maxr][c]) == 0) {
      --r;
      continue;
    }
    if (maxr != r) {
      for (int i = c; i <= tot; ++i) swap(A[r][i], A[maxr][i]);
      for (int i = 1; i <= n; ++i) swap(B[r][i], B[maxr][i]);
    }
    for (int i = 1; i <= tot; ++i)
      if (i != r && dcmp(A[i][c]) != 0) {
        for (int j = n; j >= 1; --j) B[i][j] -= B[r][j] / A[r][c] * A[i][c];
        for (int j = tot; j >= c; --j) A[i][j] -= A[r][j] / A[r][c] * A[i][c];
      }
  }
  int ra = r;
  for (int ed = 1; ed <= n; ++ed)
    for (int i = ra - 1; i >= 1; --i) X[i][ed] = B[i][ed] / A[i][i];
}
int main() {
  scanf("%d%d%d%d", &n, &m, &a, &b);
  if (a > b) swap(a, b);
  for (int i = 1; i <= m; ++i) {
    scanf("%d%d", &u, &v);
    g[u].push_back(v);
    g[v].push_back(u);
    ++degree[u], ++degree[v];
  }
  for (int i = 1; i <= n; ++i) scanf("%lf", &p[i]);
  getA(), getB();
  gauss();
  for (int i = 1; i <= n; ++i)
    printf("%.12lf%c", X[getidx(a, b)][i], i == n ? '\n' : ' ');
}
