#include <bits/stdc++.h>
using namespace std;
const int MOD = 1000000007;
const long long INF = 1e18;
const long double PI = acos((long double)-1);
const int xd[4] = {1, 0, -1, 0}, yd[4] = {0, 1, 0, -1};
const int MN = 2e5 + 5;
int N, M, par[MN], cnt[MN], cc[MN], S, T, D1, D2;
bool bet, fnd, done[MN][2];
vector<pair<int, int> > edges, res;
inline int root(int u) {
  while (u != par[u]) {
    par[u] = par[par[u]];
    u = par[u];
  }
  return u;
}
inline void merge(int a, int b) {
  bool has1 = (a == S || b == S);
  bool has2 = (a == T || b == T);
  a = root(a), b = root(b);
  cnt[a] |= cnt[b];
  par[b] = a;
  if (has1) cnt[a] |= 1;
  if (has2) cnt[a] |= 2;
}
int main() {
  ios::sync_with_stdio(0);
  cin.tie(0);
  cin >> N >> M;
  for (int i = 1; i <= N; i++) par[i] = i;
  for (int i = 1; i <= M; i++) {
    int a, b;
    cin >> a >> b;
    edges.push_back({a, b});
  }
  cin >> S >> T >> D1 >> D2;
  for (pair<int, int> ao : edges) {
    for (int i = 0; i < 2; i++) {
      if (ao.first == S) cc[ao.second] |= 1, cnt[root(ao.second)] |= 1;
      if (ao.first == T) cc[ao.second] |= 2, cnt[root(ao.second)] |= 2;
      swap(ao.first, ao.second);
    }
    if ((ao.first == S && ao.second == T) || (ao.first == T && ao.second == S))
      bet = true;
    if (ao.first == S || ao.second == S || ao.first == T || ao.second == T)
      continue;
    if (root(ao.first) == root(ao.second)) continue;
    merge(ao.first, ao.second);
    res.push_back(ao);
  }
  for (int i = 1; i <= N; i++) {
    if (cnt[root(i)] == 3 || i == S || i == T) continue;
    if ((cnt[root(i)] & 1) && (cc[i] & 1) && !done[root(i)][0]) {
      res.push_back({i, S});
      done[par[i]][0] = true;
      D1--;
    }
    if ((cnt[root(i)] & 2) && (cc[i] & 2) && !done[root(i)][1]) {
      res.push_back({i, T});
      done[par[i]][1] = true;
      D2--;
    }
  }
  if (D1 < 0 || D2 < 0) {
    cout << "No"
         << "\n";
    return 0;
  }
  for (int i = 1; i <= N; i++) {
    if (cnt[root(i)] != 3 || i == S || i == T) continue;
    if (D1 && (cnt[root(i)] & 1) && (cc[i] & 1) && !done[root(i)][0]) {
      if (done[par[i]][1] && fnd) continue;
      if (done[par[i]][1]) fnd = true;
      res.push_back({i, S});
      done[par[i]][0] = true;
      D1--;
    }
    if (D2 && (cnt[root(i)] & 2) && (cc[i] & 2) && !done[root(i)][1]) {
      if (done[par[i]][0] && fnd) continue;
      if (done[par[i]][0]) fnd = true;
      res.push_back({i, T});
      done[par[i]][1] = true;
      D2--;
    }
  }
  if (!fnd) {
    if (!bet) {
      cout << "No"
           << "\n";
      return 0;
    }
    res.push_back({S, T});
    D1--, D2--;
  }
  if (D1 < 0 || D2 < 0) {
    cout << "No"
         << "\n";
    return 0;
  }
  int cnt = 0;
  for (int i = 1; i <= N; i++) par[i] = i;
  for (pair<int, int> ao : res) {
    if (root(ao.first) == root(ao.second)) continue;
    par[root(ao.first)] = root(ao.second);
    cnt++;
  }
  if (cnt != N - 1) {
    cout << "No"
         << "\n";
    return 0;
  }
  cout << "Yes"
       << "\n";
  for (pair<int, int> ao : res) cout << ao.first << " " << ao.second << "\n";
}
