#include <bits/stdc++.h>
const int LARGE = 22;
const long double EPS = 1e-6;
using std::cin;
using std::cout;
using std::endl;
long double mat[501][501];
bool graph[23][23];
int degree[LARGE + 1];
long double prob[LARGE + 1];
int n, m, a, b;
template <class T>
T xabs(T x) {
  if (x < 0) return -x;
  return x;
}
int encode(int a, int b) { return n * (a - 1) + b - ((a > b) ? (a - 1) : a); }
long double cost(int i, int j, int x, int y) {
  long double result = 0;
  if (i == x && j == y) result = prob[i] * prob[j];
  if (i == x && j != y) {
    result = prob[i] * (1 - prob[j]) * (1.0 / degree[j]) * graph[j][y];
  }
  if (i != x && j == y)
    result = (1 - prob[i]) * (1.0 / degree[i]) * graph[i][x] * prob[j];
  if (i != x && j != y)
    result = (1 - prob[i]) * (1.0 / degree[i]) * graph[i][x] * (1 - prob[j]) *
             (1.0 / degree[j]) * graph[j][y];
  return result;
}
void print() {
  for (int i = 1; i <= n * n; i++) {
    for (int j = 1; j <= n * n + n; j++) {
      cout.width(8);
      cout.setf(std::ios::fixed);
      cout << std::setprecision(3) << mat[i][j] << " ";
    }
    cout << endl;
  }
}
int main() {
  cin >> n >> m >> a >> b;
  if (a == b) {
    for (int i = 1; i <= n; i++) {
      if (i == a)
        cout << 1 << " ";
      else
        cout << 0 << " ";
    }
    return 0;
  }
  for (int i = 1; i <= m; i++) {
    int from, to;
    cin >> from >> to;
    graph[from][to] = graph[to][from] = 1;
    degree[from] += 1;
    degree[to] += 1;
  }
  for (int i = 1; i <= n; i++) {
    cin >> prob[i];
  }
  int len = n * n - n;
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= n; j++) {
      if (i == j) continue;
      int curr = encode(i, j);
      mat[curr][curr] = -1;
      for (int x = 1; x <= n; x++) {
        for (int y = 1; y <= n; y++) {
          if (x == y) {
            mat[curr][len + x] -= cost(i, j, x, y);
          } else {
            mat[curr][encode(x, y)] += cost(i, j, x, y);
          }
        }
      }
    }
  }
  for (int i = 1; i <= len; i++) {
    if (xabs(mat[i][i]) < EPS) {
      int pos = -1;
      for (int j = i + 1; j <= len; j++) {
        if (xabs(mat[j][i]) >= EPS) {
          pos = j;
          break;
        }
      }
      if (pos != -1) {
        std::swap(mat[i], mat[pos]);
      } else {
        cout << " exm ?? " << endl;
        return 0;
      }
    }
    for (int j = i + 1; j <= len; j++) {
      long double f = mat[j][i] / mat[i][i];
      for (int k = i; k <= n * n; k++) {
        mat[j][k] -= f * mat[i][k];
      }
    }
  }
  for (int i = len; i >= 1; i--) {
    long double f = mat[i][i];
    for (int j = len + 1; j <= n * n; j++) {
      mat[i][j] /= f;
    }
    mat[i][i] /= f;
    for (int j = i - 1; j >= 1; j--) {
      long double f2 = mat[j][i];
      mat[j][i] = 0;
      for (int k = len + 1; k <= n * n; k++) {
        mat[j][k] -= f2 * mat[i][k];
      }
    }
  }
  for (int i = 1; i <= n; i++) {
    cout.setf(std::ios::fixed);
    cout << std::setprecision(10) << mat[encode(a, b)][len + i] << " ";
  }
  return 0;
}
