#include <bits/stdc++.h>
using namespace std;
set<int> ads, adt;
map<int, int> unires, uniret;
map<int, pair<int, int>> unireambii;
vector<pair<int, int>> r, edge;
int sef[200010], marime[200010];
int n, m, s, t, mxs, mxt;
bool muchiest = 0;
int gasire(int nod);
void unire(int a, int b);
int main() {
  cin >> n >> m;
  for (int i = 1; i <= n; i++) sef[i] = i, marime[i] = 1;
  while (m--) {
    cin >> s >> t;
    edge.push_back({s, t});
  }
  cin >> s >> t >> mxs >> mxt;
  for (pair<int, int> &i : edge) {
    if (i.second == s) ads.insert(i.first);
    if (i.first == s) ads.insert(i.second);
    if (i.first == t) adt.insert(i.second);
    if (i.second == t) adt.insert(i.first);
    if (i.first != s && i.first != t && i.second != s && i.second != t) {
      if (gasire(i.first) != gasire(i.second)) {
        unire(i.first, i.second);
        r.push_back({i.first, i.second});
      }
    }
  }
  if (ads.find(t) != ads.end()) {
    ads.erase(t);
    adt.erase(s);
    muchiest = 1;
  }
  for (auto i : ads) unires[gasire(i)] = i;
  set<int> de_scos;
  for (auto i : adt) {
    uniret[gasire(i)] = i;
    if (unires.find(gasire(i)) != unires.end()) {
      unireambii[gasire(i)] = {unires[gasire(i)], i};
      unires.erase(gasire(i));
      de_scos.insert(gasire(i));
    }
  }
  for (auto i : de_scos) uniret.erase(i);
  for (auto i : unires) {
    mxs--;
    if (mxs < 0) {
      cout << "No";
      return 0;
    }
    r.push_back({s, i.second});
    unire(s, i.first);
  }
  for (auto i : uniret) {
    mxt--;
    if (mxt < 0) {
      cout << "No";
      return 0;
    }
    r.push_back({t, i.second});
    unire(t, i.first);
  }
  if (unireambii.empty() && muchiest) {
    mxs--;
    mxt--;
    unire(s, t);
    r.push_back({s, t});
  }
  for (auto i : unireambii) {
    if (gasire(s) != gasire(t)) {
      unire(s, i.first);
      unire(t, i.first);
      r.push_back({s, i.second.first});
      r.push_back({t, i.second.second});
      mxs--;
      mxt--;
    } else if (mxs > 0) {
      unire(s, i.first);
      r.push_back({s, i.second.first});
      mxs--;
    } else {
      unire(t, i.first);
      r.push_back({t, i.second.second});
      mxt--;
    }
  }
  int f = gasire(1);
  for (int i = 1; i <= n; i++) {
    if (f != gasire(i)) {
      cout << "No";
      return 0;
    }
  }
  if (mxs < 0 || mxt < 0) {
    cout << "No";
    return 0;
  }
  cout << "Yes\n";
  for (auto i : r) {
    cout << i.first << ' ' << i.second << '\n';
  }
  return 0;
}
int gasire(int nod) {
  if (sef[nod] != nod) sef[nod] = gasire(sef[nod]);
  return sef[nod];
}
void unire(int a, int b) {
  a = sef[a];
  b = sef[b];
  if (marime[a] > marime[b]) {
    marime[a] += marime[b];
    sef[b] = a;
  } else {
    marime[b] += marime[a];
    sef[a] = b;
  }
}
