#include <bits/stdc++.h>
using namespace std;
int n, m, a, b, stateCnt;
vector<vector<int> > g;
vector<double> stayP;
double prob[300][300], rev[300][300];
int state[30][30];
const double eps = 1e-9;
int getState(int a, int b) {
  if (a > b) swap(a, b);
  return state[a][b];
}
void swapRow(double a[300][300], int r1, int r2) {
  for (int j = 0; j < stateCnt; j++) swap(a[r1][j], a[r2][j]);
}
void getReverse() {
  for (int i = 0; i < stateCnt; i++) rev[i][i] = 1;
  for (int I = 0; I < stateCnt; I++) {
    int row = I;
    double ma = prob[I][I];
    for (int j = I + 1; j < stateCnt; j++)
      if (abs(prob[I][j]) > ma) {
        row = j;
        ma = abs(prob[I][j]);
      }
    if (row != I) {
      swapRow(prob, I, row);
      swapRow(rev, I, row);
    }
    for (int i = 0; i < stateCnt; i++)
      if (i != I) {
        double d = prob[i][I] / prob[I][I];
        for (int j = 0; j < stateCnt; j++) {
          prob[i][j] -= prob[I][j] * d;
          rev[i][j] -= rev[I][j] * d;
        }
      }
  }
  for (int i = 0; i < stateCnt; i++)
    for (int j = 0; j < stateCnt; j++) rev[i][j] /= prob[i][i];
}
void print(double a[300][300]) {
  for (int i = 0; i < stateCnt; i++) {
    for (int j = 0; j < stateCnt; j++) cout << a[i][j] << ' ';
    cout << endl;
  }
  cout << endl;
}
double oldProb[300][300];
void mult() {
  double buf[300][300] = {};
  for (int i = 0; i < stateCnt; i++)
    for (int k = 0; k < stateCnt; k++)
      for (int j = 0; j < stateCnt; j++)
        buf[i][j] += prob[i][k] * oldProb[k][j];
  memcpy(prob, buf, sizeof(buf));
}
int main() {
  cin >> n >> m >> a >> b;
  stateCnt = 0;
  for (int i = 0; i < n; i++)
    for (int j = i; j < n; j++) {
      state[i][j] = stateCnt;
      stateCnt++;
    }
  a--, b--;
  g.resize(n);
  stayP.resize(n);
  for (int i = 0; i < m; i++) {
    int x, y;
    cin >> x >> y;
    x--, y--;
    g[x].push_back(y);
    g[y].push_back(x);
  }
  for (int i = 0; i < n; i++) cin >> stayP[i];
  for (int i = 0; i < n; i++)
    for (int j = i + 1; j < n; j++) {
      prob[getState(i, j)][getState(i, j)] = stayP[i] * stayP[j];
      double ta = (1 - stayP[i]) / (int)((g[i]).size());
      double tb = (1 - stayP[j]) / (int)((g[j]).size());
      for (int b = 0; b < (int)((g[j]).size()); b++) {
        int tob = g[j][b];
        prob[getState(i, j)][getState(i, tob)] += stayP[i] * tb;
      }
      for (int a = 0; a < (int)((g[i]).size()); a++) {
        int toa = g[i][a];
        prob[getState(i, j)][getState(toa, j)] += ta * stayP[j];
      }
      for (int a = 0; a < (int)((g[i]).size()); a++)
        for (int b = 0; b < (int)((g[j]).size()); b++) {
          int toa = g[i][a];
          int tob = g[j][b];
          prob[getState(i, j)][getState(toa, tob)] += ta * tb;
        }
    }
  for (int i = 0; i < stateCnt; i++)
    for (int j = 0; j < stateCnt; j++) prob[i][j] *= -1;
  for (int i = 0; i < stateCnt; i++) prob[i][i] += 1;
  getReverse();
  int t = getState(a, b);
  cout.precision(9);
  for (int i = 0; i < n; i++) cout << rev[t][getState(i, i)] << ' ';
}
