#include <bits/stdc++.h>
using namespace std;
istream& operator>>(istream& cin, pair<long long, long long>& p) {
  cin >> p.first >> p.second;
  p.first--;
  p.second--;
  return cin;
}
ostream& operator<<(ostream& cout, pair<long long, long long> p) {
  cout << p.first + 1 << ' ' << p.second + 1 << endl;
  return cout;
}
bool occur(long long v, pair<long long, long long> edge) {
  return v == edge.first || v == edge.second;
}
long long get_par(long long v, vector<long long>& par) {
  if (v == par[v]) return v;
  return par[v] = get_par(par[v], par);
}
bool unite(long long v, long long u, vector<long long>& par,
           vector<long long>& rank) {
  v = get_par(v, par);
  u = get_par(u, par);
  if (v == u) return false;
  if (rank[v] < rank[u])
    par[v] = u;
  else if (rank[u] < rank[v])
    par[u] = v;
  else {
    par[v] = u;
    rank[u]++;
  }
  return true;
}
int main() {
  long long n, m, s, t, ds, dt;
  cin >> n >> m;
  vector<long long> par(n);
  vector<long long> rank(n, 1);
  vector<pair<long long, long long>> edge(m);
  vector<pair<long long, long long>> intree;
  for (int i = 0; i < n; i++) par[i] = i;
  for (int i = 0; i < m; i++) {
    cin >> edge[i];
  }
  cin >> s >> t >> ds >> dt;
  s--;
  t--;
  for (int i = 0; i < m; i++) {
    if (occur(s, edge[i]) || occur(t, edge[i])) continue;
    if (unite(edge[i].first, edge[i].second, par, rank))
      intree.push_back(edge[i]);
  }
  map<pair<long long, long long>, pair<long long, long long>> cnnct;
  for (int i = 0; i < m; i++) {
    long long v = edge[i].first, u = edge[i].second;
    if (occur(s, edge[i]) || occur(t, edge[i]))
      cnnct[{get_par(v, par), get_par(u, par)}] = {v, u};
  }
  vector<long long> clr(n, 0);
  vector<bool> sclr(n), tclr(n, 0);
  for (auto e : cnnct) {
    long long v = e.first.first, u = e.first.second;
    if (v == s) sclr[u] = 1;
    if (u == s) sclr[v] = 1;
    if (v == t) tclr[u] = 1;
    if (u == t) tclr[v] = 1;
  }
  for (int i = 0; i < n; i++) {
    if (i == s || i == t)
      clr[i] = -5;
    else
      clr[i] = (long long)sclr[i] + 2 * (long long)tclr[i];
  }
  long long scnt = 0, tcnt = 0;
  for (auto e : cnnct) {
    long long v = e.first.first, u = e.first.second;
    if (occur(s, e.first)) {
      if (u == s) swap(u, v);
      if (clr[u] != 1) continue;
      scnt++;
    } else {
      if (u == t) swap(u, v);
      if (clr[u] != 2) continue;
      tcnt++;
    }
    clr[u] = -5;
    unite(v, u, par, rank);
    intree.push_back(e.second);
  }
  long long fix = -1;
  for (auto e : cnnct) {
    if (clr[e.first.first] == 3)
      fix = e.first.first;
    else if (clr[e.first.second] == 3)
      fix = e.first.second;
  }
  if (fix == -1) {
    for (auto e : cnnct) {
      long long v = e.first.first, u = e.first.second;
      if (occur(s, e.first) && occur(t, e.first)) {
        intree.push_back({v, u});
        unite(v, u, par, rank);
        scnt++;
        tcnt++;
      }
    }
  } else {
    bool sf = 0, tf = 0;
    for (auto e : cnnct) {
      long long v = e.first.first, u = e.first.second;
      if (!sf && occur(fix, e.first) && occur(s, e.first)) {
        intree.push_back(e.second);
        unite(v, u, par, rank);
        clr[v] = clr[u] = -5;
        sf = 1;
        scnt++;
      }
      if (!tf && occur(fix, e.first) && occur(t, e.first)) {
        intree.push_back(e.second);
        unite(v, u, par, rank);
        clr[v] = clr[u] = -5;
        tf = 1;
        tcnt++;
      }
    }
  }
  if (scnt > ds || tcnt > dt) {
    cout << "No\n";
    return 0;
  }
  for (auto e : cnnct) {
    long long v = e.first.first, u = e.first.second;
    if (clr[v] != 3 && clr[u] != 3) continue;
    if (occur(s, e.first) && scnt < ds) {
      intree.push_back(e.second);
      unite(v, u, par, rank);
      clr[v] = clr[u] = -5;
      scnt++;
    }
    if (occur(t, e.first) && tcnt < dt) {
      intree.push_back(e.second);
      unite(v, u, par, rank);
      clr[v] = clr[u] = -5;
      tcnt++;
    }
  }
  bool flag = 0;
  for (auto e : cnnct) {
    if (clr[e.first.first] == 3 || clr[e.first.second] == 3) flag = 1;
  }
  if (scnt > ds || tcnt > dt || flag) {
    cout << "No\n";
    return 0;
  }
  cout << "Yes\n";
  for (int i = 0; i < intree.size(); i++) {
    cout << intree[i];
  }
  return 0;
}
