#include <bits/stdc++.h>
using namespace std;
int n, m;
vector<int> g[23];
int px[1000], py[1000];
double a[1000][1000];
double stay[1000];
double ans[1000];
int id[1000][1000];
double mtx_a[1000][1000];
double mtx_b[1000][1000];
int main() {
  int ox, oy;
  scanf("%d%d%d%d", &n, &m, &ox, &oy);
  --ox;
  --oy;
  for (int i = 0; i < m; i++) {
    int a, b;
    scanf("%d%d", &a, &b);
    --a;
    --b;
    g[a].push_back(b);
    g[b].push_back(a);
  }
  for (int i = 0; i < n; i++) scanf("%lf", &stay[i]);
  int nsz = 0;
  for (int i = 0; i < n; i++)
    for (int j = 0; j <= i; j++) {
      id[i][j] = id[j][i] = nsz;
      px[nsz] = i;
      py[nsz] = j;
      nsz++;
    }
  for (int i = 0; i < nsz; i++) {
    int sx = px[i];
    int sy = py[i];
    if (sx == sy) {
      a[i][i] = 1.0;
      continue;
    }
    for (int ex = 0; ex <= g[sx].size(); ex++) {
      int nx = (ex == g[sx].size()) ? sx : g[sx][ex];
      double gox =
          (ex == g[sx].size()) ? stay[sx] : (1.0 - stay[sx]) / g[sx].size();
      for (int ey = 0; ey <= g[sy].size(); ey++) {
        int ny = (ey == g[sy].size()) ? sy : g[sy][ey];
        double goy =
            (ey == g[sy].size()) ? stay[sy] : (1.0 - stay[sy]) / g[sy].size();
        int nid = id[nx][ny];
        a[i][nid] += gox * goy;
      }
    }
  }
  for (int i = 0; i < nsz; i++)
    for (int j = 0; j < nsz; j++) mtx_a[i][j] = a[i][j];
  for (int t = 0; t < 17; t++) {
    for (int i = 0; i < nsz; i++)
      for (int j = 0; j < nsz; j++) mtx_b[i][j] = 0.0;
    for (int i = 0; i < nsz; i++)
      for (int j = 0; j < nsz; j++) {
        for (int k = 0; k < nsz; k++) {
          mtx_b[i][j] += mtx_a[i][k] * mtx_a[k][j];
        }
        if (mtx_b[i][j] < 1e-30) mtx_b[i][j] = 0;
      }
    for (int i = 0; i < nsz; i++)
      for (int j = 0; j < nsz; j++) mtx_a[i][j] = mtx_b[i][j];
  }
  int pn = id[ox][oy];
  for (int i = 0; i < nsz; i++) {
    ans[i] = mtx_a[pn][i];
  }
  for (int i = 0; i < n; i++) printf("%.10f ", ans[id[i][i]]);
  return 0;
}
