#include <bits/stdc++.h>
using namespace std;
const int N = 24, M = N * N / 2;
const double eps = 1e-12;
struct Edge {
  int v, nxt;
} e[N * N];
int nume, g[N], dg[N], n, tot;
void addedge(int u, int v) {
  e[++nume].v = v;
  e[nume].nxt = g[u];
  g[u] = nume;
}
double p[N], mz[M][M];
int id[N][N];
int gid(int x, int y) {
  if (x > y) swap(x, y);
  return id[x][y];
}
double x[M];
int gauss(int s) {
  for (int i = 0; i < tot; i++) {
    x[i] = 0;
    for (int j = 0; j < tot; j++) mz[i][j] = 0;
  }
  for (int i = 0; i < n; i++)
    for (int j = i + 1, u; j < n; j++) {
      u = gid(i, j);
      mz[u][u] += 1 - p[i] * p[j];
      for (int k = g[i], a; k; k = e[k].nxt) {
        a = e[k].v;
        mz[u][gid(a, j)] -= (1 - p[i]) / dg[i] * p[j];
      }
      for (int k = g[j], b; k; k = e[k].nxt) {
        b = e[k].v;
        mz[u][gid(i, b)] -= p[i] * (1 - p[j]) / dg[j];
      }
      for (int k = g[i], a; k; k = e[k].nxt) {
        a = e[k].v;
        for (int l = g[j], b; l; l = e[l].nxt) {
          b = e[l].v;
          mz[u][gid(a, b)] -= (1 - p[i]) * (1 - p[j]) / dg[j] / dg[i];
        }
      }
    }
  for (int i = 0, u; i < n; i++) {
    u = gid(i, i);
    mz[u][u] = 1;
    if (i == s) x[u] = 1;
  }
  int i, j, k, col, max_r, equ, var;
  var = equ = tot;
  for (k = 0, col = 0; k < equ && col < var; k++, col++) {
    max_r = k;
    for (i = k + 1; i < equ; i++)
      if (fabs(mz[i][col]) > fabs(mz[max_r][col])) max_r = i;
    if (fabs(mz[max_r][col]) < eps) return 0;
    if (k != max_r) {
      for (j = col; j < var; j++) swap(mz[k][j], mz[max_r][j]);
      swap(x[k], x[max_r]);
    }
    x[k] /= mz[k][col];
    for (j = col + 1; j < var; j++) mz[k][j] /= mz[k][col];
    mz[k][col] = 1;
    for (i = 0; i < equ; i++)
      if (i != k) {
        x[i] -= x[k] * mz[i][k];
        for (j = col + 1; j < var; j++) mz[i][j] -= mz[k][j] * mz[i][col];
        mz[i][col] = 0;
      }
  }
  return 1;
}
int main() {
  int m, a, b;
  scanf("%d%d%d%d", &n, &m, &a, &b);
  for (int i = 0; i < n; i++)
    for (int j = i; j < n; j++) id[i][j] = tot++;
  a--, b--;
  int u, v;
  while (m--) {
    scanf("%d%d", &u, &v);
    u--, v--;
    addedge(u, v);
    addedge(v, u);
    dg[u]++, dg[v]++;
  }
  for (int i = 0; i < n; i++) scanf("%lf", &p[i]);
  for (int i = 0; i < n; i++) {
    gauss(i);
    if (i) putchar(' ');
    printf("%.10f", x[gid(a, b)]);
  }
  return 0;
}
