#include <bits/stdc++.h>
#pragma GCC target("avx2")
#pragma GCC optimization("O3")
#pragma GCC optimization("unroll-loops")
using namespace std;
template <typename T>
void DBG(const char* name, T&& H) {
  cerr << name << " = " << H << ')' << '\n';
}
template <typename T, typename... Args>
void DBG(const char* names, T&& H, Args&&... args) {
  const char* NEXT = strchr(names + 1, ',');
  cerr.write(names, NEXT - names) << " = " << H << " |";
  DBG(NEXT + 1, args...);
}
using ll = long long;
using ld = long double;
const long long mod = 1e9 + 7;
const long double PI = acos(-1.0);
const long long INF = 1e18;
const int maxN = 2e5 + 1;
void bad() {
  cout << "No\n";
  exit(0);
}
struct DSU {
  using T = int;
  vector<T> parent;
  vector<T> size;
  T numComponents = 0;
  void init(T n = 0) {
    parent.resize(n);
    size.assign(n, 1);
    numComponents = n;
    for (T i = 0; i < n; i++) parent[i] = i;
  }
  T getParent(T x) {
    return (x == parent[x]) ? x : parent[x] = getParent(parent[x]);
  }
  bool merge(T x, T y) {
    x = getParent(x);
    y = getParent(y);
    if (x == y) {
      return false;
    }
    if (size[x] < size[y]) {
      swap(x, y);
    }
    parent[y] = x;
    size[x] += size[y];
    numComponents--;
    return true;
  }
};
int N, M, s, t, ds, dt;
DSU uf;
bool connect = false;
set<int> sedge, tedge;
map<int, int> sID, tID;
vector<pair<int, int>> edge;
vector<pair<int, int>> stedges;
void mergeUniqueS() {
  vector<int> to;
  for (auto i : sedge) {
    if (!tedge.count(i)) {
      to.push_back(i);
    }
  }
  if (to.size() >= ds) bad();
  ds -= to.size();
  for (auto i : to) {
    stedges.push_back({s, sID[i]});
  }
}
void mergeUniqueT() {
  vector<int> to;
  for (auto i : tedge) {
    if (!sedge.count(i)) {
      to.push_back(i);
    }
  }
  if (to.size() >= dt) bad();
  dt -= to.size();
  for (auto i : to) {
    stedges.push_back({t, tID[i]});
  }
}
void mergeTotal() {
  vector<int> to;
  for (auto i : tedge) {
    if (sedge.count(i)) to.push_back(i);
  }
  if (to.size()) {
    if (ds + dt < to.size() + 1) bad();
    stedges.push_back({s, sID[to[0]]});
    stedges.push_back({t, tID[to[0]]});
    ds--;
    dt--;
    for (int i = 1; i < to.size(); i++) {
      if (ds) {
        stedges.push_back({s, sID[to[i]]});
        ds--;
      } else {
        stedges.push_back({t, tID[to[i]]});
        dt--;
      }
    }
  } else {
    if (connect)
      stedges.push_back({s, t});
    else
      bad();
  }
}
void Solve() {
  cin >> N >> M;
  uf.init(N + 1);
  for (int i = 0; i < M; i++) {
    int a, b;
    cin >> a >> b;
    edge.push_back({a, b});
  }
  cin >> s >> t >> ds >> dt;
  if (s > t) {
    swap(s, t);
    swap(ds, dt);
  }
  for (auto i : edge) {
    if ((min(i.first, i.second) == s) && (max(i.first, i.second) == t)) {
      connect = true;
      continue;
    }
    if ((i.first == s) || (i.second == s)) {
      continue;
    }
    if ((i.first == t) || (i.second == t)) {
      continue;
    }
    if (uf.merge(i.first, i.second)) {
      stedges.push_back({i.first, i.second});
    }
  }
  for (auto i : edge) {
    if ((min(i.first, i.second) == s) && (max(i.first, i.second) == t)) {
      continue;
    }
    if ((i.first == s) || (i.second == s)) {
      int other = i.first;
      if (i.first == s) other = i.second;
      sedge.insert(uf.getParent(other));
      sID[uf.getParent(other)] = other;
      continue;
    }
    if ((i.first == t) || (i.second == t)) {
      int other = i.first;
      if (i.first == t) other = i.second;
      tedge.insert(uf.getParent(other));
      tID[uf.getParent(other)] = other;
      continue;
    }
  }
  mergeUniqueS();
  mergeUniqueT();
  mergeTotal();
  cout << "Yes\n";
  for (auto i : stedges) {
    cout << i.first << " " << i.second << '\n';
  }
}
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  int tt = 1;
  while (tt--) {
    Solve();
  }
  return 0;
}
