#include <bits/stdc++.h>
using namespace std;
const int maxn = 4e5 + 5;
int vis[maxn];
pair<int, int> b[maxn];
int ufs[maxn];
inline int find(int u) {
  if (ufs[u] == u)
    return u;
  else
    return ufs[u] = find(ufs[u]);
}
inline bool join(int u, int v) {
  if (find(u) == find(v)) return false;
  ufs[find(u)] = find(v);
  return true;
}
int n, m, s, t, ds, dt;
inline bool chk(int u, int v) {
  if (u == s || u == t) return true;
  if (v == s || v == t) return true;
  return false;
}
int a[maxn][2], c[maxn], mem[maxn];
int main() {
  cin >> n >> m;
  for (int i = 1; i <= m; i++) {
    scanf("%d%d", &b[i].first, &b[i].second);
  }
  cin >> s >> t >> ds >> dt;
  for (int i = 1; i <= n; i++) {
    ufs[i] = i;
  }
  int cnt = 0;
  for (int i = 1; i <= m; i++) {
    if (chk(b[i].first, b[i].second)) continue;
    if (join(b[i].first, b[i].second)) {
      cnt++;
      vis[i] = 1;
    }
    c[i] = 1;
  }
  int flg = 0;
  for (int i = 1; i <= m; i++) {
    if (c[i]) continue;
    int u = b[i].first, v = b[i].second;
    if (u == s && v == t) {
      flg = i;
      continue;
    }
    if (u == t && v == s) {
      flg = i;
      continue;
    }
    if (u == s) a[find(v)][0] = i;
    if (v == s) a[find(u)][0] = i;
    if (u == t) a[find(v)][1] = i;
    if (v == t) a[find(u)][1] = i;
  }
  for (int i = 1; i <= n; i++) {
    if (find(i) != i) continue;
    if (a[i][0] && a[i][1]) continue;
    if (a[i][0]) {
      join(i, s);
      vis[a[i][0]] = 1;
      ds--;
      cnt++;
    }
    if (a[i][1]) {
      join(i, t);
      vis[a[i][1]] = 1;
      cnt++;
      dt--;
    }
  }
  if (ds < 0 || dt < 0) {
    cout << "No" << endl;
    return 0;
  }
  for (int i = 1; i <= n; i++) {
    if (find(i) != i) continue;
    if (a[i][0] && a[i][1]) {
      ds--;
      dt--;
      vis[a[i][0]] = 1;
      vis[a[i][1]] = 1;
      join(i, s);
      join(i, t);
      cnt += 2;
      mem[i] = 1;
      break;
    }
  }
  if (ds < 0 || dt < 0) {
    cout << "No" << endl;
    return 0;
  }
  for (int i = 1; i <= n; i++) {
    if (find(i) != i) continue;
    if (mem[i]) continue;
    if (a[i][0] && a[i][1]) {
      if (ds) {
        ds--;
        vis[a[i][0]] = 1;
        cnt++;
        join(i, s);
        continue;
      }
      if (dt) {
        dt--;
        vis[a[i][1]] = 1;
        cnt++;
        join(i, t);
        continue;
      }
    }
  }
  if (find(s) != find(t) && flg) {
    cnt++;
    ds--;
    dt--;
    vis[flg] = 1;
    join(s, t);
  }
  if (cnt != n - 1) {
    cout << "No" << endl;
    return 0;
  }
  if (ds < 0 || dt < 0) {
    cout << "No" << endl;
    return 0;
  }
  cout << "Yes" << endl;
  for (int i = 1; i <= m; i++) {
    if (vis[i]) {
      printf("%d %d\n", b[i].first, b[i].second);
    }
  }
}
