#include <bits/stdc++.h>
using namespace std;
const int N = 30;
const double eps = 1e-14;
double A[N * N][N * N], B[N * N][N], X[N * N][N];
int mp[N][N], tot;
double p[N];
int du[N];
vector<int> vv[N];
void getA(int n) {
  tot = 0;
  for (int i = 0; i < n; i++) {
    for (int j = i; j < n; j++) {
      mp[j][i] = mp[i][j] = tot++;
    }
  }
  for (int i = 0; i < n; i++) {
    A[mp[i][i]][mp[i][i]] = 1;
    for (int j = i + 1; j < n; j++) {
      int s = mp[i][j];
      A[s][s] += 1 - p[i] * p[j];
      for (int i1 = 0; i1 < vv[i].size(); i1++) {
        int ii = vv[i][i1];
        int t = mp[ii][j];
        A[s][t] -= (1 - p[i]) * p[j] / du[i];
      }
      for (int i1 = 0; i1 < vv[j].size(); i1++) {
        int jj = vv[j][i1];
        int t = mp[i][jj];
        A[s][t] -= p[i] * (1 - p[j]) / du[j];
      }
      for (int i1 = 0; i1 < vv[i].size(); i1++) {
        for (int i2 = 0; i2 < vv[j].size(); i2++) {
          int u = vv[i][i1], v = vv[j][i2];
          int t = mp[u][v];
          A[s][t] -= (1 - p[i]) * (1 - p[j]) / du[i] / du[j];
        }
      }
    }
  }
}
void getB(int n) {
  memset(B, 0, sizeof(B));
  for (int i = 0; i < n; i++) {
    B[mp[i][i]][i] = 1;
  }
}
void gauss(int n, int m) {
  for (int i = 0; i < n; i++) {
    double tmp = fabs(A[i][i]);
    int id = i;
    for (int j = i; j < n; j++) {
      if (fabs(A[j][i]) > tmp) {
        tmp = fabs(A[j][i]), id = j;
      }
    }
    for (int j = 0; j < n; j++) swap(A[i][j], A[id][j]);
    for (int j = 0; j < m; j++) swap(B[i][j], B[id][j]);
    for (int j = i + 1; j < n; j++)
      if (fabs(A[j][i]) > eps) {
        tmp = A[j][i] / A[i][i];
        for (int k = i; k < n; k++) {
          A[j][k] -= A[i][k] * tmp;
        }
        for (int k = 0; k < m; k++) {
          B[j][k] -= B[i][k] * tmp;
        }
      }
  }
  for (int i = 0; i < m; i++) {
    for (int j = n - 1; j >= 0; j--) {
      for (int k = n - 1; k > j; k--) {
        B[j][i] -= A[j][k] * X[k][i];
      }
      X[j][i] = B[j][i] / A[j][j];
    }
  }
}
int main() {
  int n, m, s, t;
  while (scanf("%d%d%d%d", &n, &m, &s, &t) != EOF) {
    for (int i = 0; i < n; i++) vv[i].clear();
    s--;
    t--;
    memset(du, 0, sizeof(du));
    for (int i = 0; i < m; i++) {
      int a, b;
      scanf("%d%d", &a, &b);
      a--;
      b--;
      du[a]++;
      du[b]++;
      vv[a].push_back(b);
      vv[b].push_back(a);
    }
    for (int i = 0; i < n; i++) scanf("%lf", &p[i]);
    memset(A, 0, sizeof(A));
    getA(n);
    getB(n);
    gauss(tot, n);
    for (int i = 0; i < n; i++) {
      printf("%.10lf%c", X[mp[s][t]][i], i == n - 1 ? '\n' : ' ');
    }
  }
  return 0;
}
