#include <bits/stdc++.h>
using namespace std;
long long poww(long long a, long long b, long long md) {
  return (!b ? 1
             : (b & 1 ? a * poww(a * a % md, b / 2, md) % md
                      : poww(a * a % md, b / 2, md) % md));
}
const long long MAXN = 1e6 + 10;
const long long INF = 8e18;
const long long MOD = 1e9 + 7;
int n, m, s, t, ds, dt, par[MAXN], H[MAXN];
vector<pair<int, int> > edges, req_s, rem_s, s_edges, ans, t_edges;
int Find(int v) {
  if (v == par[v]) return v;
  return Find(par[v]);
}
inline void Union(int v, int u) {
  u = Find(u);
  v = Find(v);
  if (u == v) return;
  if (H[v] > H[u]) swap(v, u);
  if (H[v] == H[u]) H[u]++;
  par[v] = u;
}
inline bool S(pair<int, int> e) {
  if (e.first == s || e.second == s) return true;
  return false;
}
inline bool T(pair<int, int> e) {
  if (e.first == t || e.second == t) return true;
  return false;
}
inline bool Req(pair<int, int> e) { return Find(e.first) != Find(e.second); }
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  cin >> n >> m;
  for (int i = 1; i <= n; i++) par[i] = i;
  for (int i = 0; i < m; i++) {
    int u, v;
    cin >> u >> v;
    edges.push_back({u, v});
  }
  cin >> s >> t >> ds >> dt;
  for (pair<int, int> e : edges) {
    if (!S(e))
      Union(e.first, e.second);
    else
      s_edges.push_back(e);
  }
  int deg_s = 0, deg_t = 0;
  for (pair<int, int> e : s_edges) {
    if (!Req(e) && !T(e)) rem_s.push_back(e);
    if (!T(e) && Req(e)) {
      ans.push_back(e);
      req_s.push_back(e);
      Union(e.first, e.second);
      deg_s++;
    }
  }
  for (pair<int, int> e : s_edges) {
    if (T(e) && Req(e)) {
      ans.push_back(e);
      req_s.push_back(e);
      Union(e.first, e.second);
      deg_s++;
      deg_t++;
    }
  }
  memset(H, 0, sizeof H);
  for (int i = 1; i <= n; i++) par[i] = i;
  for (pair<int, int> e : ans) Union(e.first, e.second);
  for (pair<int, int> e : edges) {
    if (T(e))
      t_edges.push_back(e);
    else if (!S(e) && Req(e))
      ans.push_back(e), Union(e.first, e.second);
  }
  for (pair<int, int> e : rem_s) {
    if (Req(e) && deg_s < ds) {
      deg_s++;
      Union(e.first, e.second);
      ans.push_back(e);
    }
  }
  for (pair<int, int> e : t_edges) {
    if (Req(e) && !S(e)) {
      deg_t++;
      ans.push_back(e);
      Union(e.first, e.second);
    }
  }
  for (pair<int, int> e : t_edges) {
    if (Req(e) && S(e)) {
      deg_t++;
      deg_s++;
      ans.push_back(e);
      Union(e.first, e.second);
    }
  }
  for (int i = 1; i <= n; i++)
    if (Find(i) != Find(1)) return cout << "No" << '\n', 0;
  if (deg_s > ds || deg_t > dt || (int)ans.size() > n - 1)
    return cout << "No" << '\n', 0;
  cout << "Yes" << '\n';
  for (pair<int, int> e : ans) cout << e.first << ' ' << e.second << '\n';
  return 0;
}
