#include <bits/stdc++.h>
using namespace std;
long long int cons;
long long int check(long long int a) {
  if (a >= cons) a %= cons;
  return a;
}
long long int check2(long long int a) {
  a %= cons;
  if (a < 0) a += cons;
  return a;
}
long long int GCD(long long int a, long long int b) {
  if (b == 0) return a;
  return GCD(b, a % b);
}
long long int exp(long long int a, long long int n) {
  if (n == 0) return 1;
  if (n == 1) return check(a);
  long long int b = exp(a, n / 2);
  if (n % 2 == 0) return check(b * b);
  return check(b * check(b * a));
}
const int N = 200010;
int parent[N], ranker[N];
vector<pair<int, int> > edges, ans;
vector<pair<int, int> > source, dest;
int getParent(int i) {
  if (i != parent[i]) parent[i] = getParent(parent[i]);
  return parent[i];
}
void unite(int first, int second) {
  first = getParent(first);
  second = getParent(second);
  if (ranker[first] < ranker[second])
    parent[first] = second;
  else {
    parent[second] = first;
    if (ranker[first] == ranker[second]) ranker[first]++;
  }
}
int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  cons = 1e9 + 7;
  int n, m;
  cin >> n >> m;
  for (int i = 1; i <= n; i++) {
    parent[i] = i;
    ranker[i] = 0;
  }
  for (int i = 0; i < m; i++) {
    int u, v;
    cin >> u >> v;
    if (u > v) swap(u, v);
    edges.push_back({u, v});
  }
  int s, t, ds, dt;
  cin >> s >> t >> ds >> dt;
  if (s > t) {
    swap(s, t);
    swap(ds, dt);
  }
  for (auto itr : edges) {
    if (itr.first == s || itr.second == s)
      source.push_back(itr);
    else if (itr.first == t || itr.second == t)
      dest.push_back(itr);
    else {
      int first = getParent(itr.first);
      int second = getParent(itr.second);
      if (first == second) continue;
      ans.push_back(itr);
      unite(itr.first, itr.second);
    }
  }
  int ind_s = source.size();
  int ind_t = dest.size();
  ind_t--;
  ind_s--;
  while (ind_t >= 0 && ind_s >= 0) {
    if (ds < dt) {
      auto itr = dest[ind_t];
      ind_t--;
      int first = getParent(itr.first);
      int second = getParent(itr.second);
      if (first == second) continue;
      if (dt <= 0) continue;
      if (itr.first == s && ds <= 0) continue;
      if (itr.first == s) ds--;
      ans.push_back(itr);
      dt--;
      unite(itr.first, itr.second);
    } else {
      auto itr = source[ind_s];
      ind_s--;
      int first = getParent(itr.first);
      int second = getParent(itr.second);
      if (first == second) continue;
      if (ds <= 0) continue;
      if (itr.second == t && dt <= 0) continue;
      ans.push_back(itr);
      ds--;
      if (itr.second == t) dt--;
      unite(itr.first, itr.second);
    }
  }
  while (ind_s >= 0) {
    auto itr = source[ind_s];
    ind_s--;
    int first = getParent(itr.first);
    int second = getParent(itr.second);
    if (first == second) continue;
    if (ds <= 0) continue;
    if (itr.second == t && dt <= 0) continue;
    ans.push_back(itr);
    ds--;
    if (itr.second == t) dt--;
    unite(itr.first, itr.second);
  }
  while (ind_t >= 0) {
    auto itr = dest[ind_t];
    ind_t--;
    int first = getParent(itr.first);
    int second = getParent(itr.second);
    if (first == second) continue;
    if (dt <= 0) continue;
    if (itr.first == s && ds <= 0) continue;
    ans.push_back(itr);
    dt--;
    unite(itr.first, itr.second);
    if (itr.first == s) ds--;
  }
  if (ans.size() != n - 1)
    cout << "No\n";
  else {
    cout << "Yes\n";
    for (auto itr : ans) cout << itr.first << " " << itr.second << "\n";
  }
}
