#include <bits/stdc++.h>
using namespace std;
int n, x, y, e, h[25], d[25], s, t, m;
double a[500][500], c[25];
struct zx {
  int v, pre;
} ed[500];
void add(int x, int y) {
  ed[++e] = (zx){y, h[x]};
  h[x] = e;
}
int get(int x, int y) { return x * n - n + y; }
void guess(int n) {
  for (int i = 1; i <= n; ++i) {
    int k = i;
    for (int j = i + 1; j <= n; ++j)
      if (fabs(a[j][i]) > fabs(a[k][i])) k = j;
    if (k != i) swap(a[k], a[i]);
    for (int j = 1; j <= n; ++j)
      if (i != j) {
        double tmp = a[j][i] / a[i][i];
        for (int k = 1; k <= n + 1; ++k) a[j][k] -= tmp * a[i][k];
      }
  }
  for (int i = 1; i <= n; ++i) a[i][n + 1] /= a[i][i];
}
int main() {
  scanf("%d%d%d%d", &n, &m, &s, &t);
  for (int i = 1; i <= m; ++i) {
    scanf("%d%d", &x, &y);
    add(x, y);
    add(y, x);
    d[x]++, d[y]++;
  }
  for (int i = 1; i <= n; ++i) scanf("%lf", &c[i]);
  for (int x = 1; x <= n; ++x)
    for (int y = 1; y <= n; ++y) {
      int u = get(x, y);
      a[u][u]--;
      if (x ^ y) a[u][u] += c[x] * c[y];
      for (int i = h[x]; i; i = ed[i].pre)
        for (int j = h[y]; j; j = ed[j].pre) {
          int p = ed[i].v, q = ed[j].v;
          if (p == q) continue;
          int v = get(p, q);
          a[u][v] += (1.0 - c[p]) / d[p] * (1.0 - c[q]) / d[q];
        }
      for (int i = h[x]; i; i = ed[i].pre) {
        int p = ed[i].v;
        if (p == y) continue;
        int v = get(p, y);
        a[u][v] += (1.0 - c[p]) / d[p] * c[y];
      }
      for (int i = h[y]; i; i = ed[i].pre) {
        int p = ed[i].v;
        if (p == x) continue;
        int v = get(x, p);
        a[u][v] += (1.0 - c[p]) / d[p] * c[x];
      }
    }
  a[get(s, t)][n * n + 1] = -1;
  guess(n * n);
  for (int i = 1; i <= n; ++i) printf("%.10lf ", a[get(i, i)][n * n + 1]);
  return 0;
}
