#include <bits/stdc++.h>
using namespace std;
const int maxn = 5e5 + 20, maxm = 1e6 + 10;
const long long mod = 1e9 + 7;
int casn, n, m, k;
vector<int> g[maxn];
pair<int, int> e[maxn];
vector<pair<int, int> > ans;
int d[maxn];
class ufs {
 public:
  int fa[maxn];
  void init(int n) {
    for (int i = 1; i <= n + 1; ++i) fa[i] = i;
  }
  int find(int now) { return fa[now] == now ? now : fa[now] = find(fa[now]); }
  inline void unite(int a, int b) { fa[find(b)] = find(a); }
  inline bool same(int a, int b) { return find(a) == find(b); }
} dsu;
int viss[maxn], vist[maxn], vis[maxn];
int main() {
  int s, t, ds, dt;
  cin >> n >> m;
  dsu.init(n);
  for (int i = 1; i <= m; ++i) {
    int a, b;
    cin >> a >> b;
    g[a].push_back(b);
    g[b].push_back(a);
    e[i] = {a, b};
  }
  cin >> s >> t >> ds >> dt;
  for (int i = 1; i <= m; ++i) {
    int a = e[i].first, b = e[i].second;
    if (a == s || a == t) continue;
    if (b == s || b == t) continue;
    if (!dsu.same(a, b)) {
      dsu.unite(a, b);
      d[a]++;
      d[b]++;
      ans.push_back(e[i]);
    }
  }
  for (auto i : g[s]) viss[dsu.find(i)] = 1;
  viss[s] = 1, vist[t] = 1;
  for (auto i : g[t]) vist[dsu.find(i)] = 1;
  for (int i = 1; i <= n; ++i)
    if (!(viss[dsu.find(i)] || vist[dsu.find(i)])) {
      cout << "No";
      return 0;
    }
  for (int i = 1; i <= m; ++i) {
    int a = e[i].first, b = e[i].second;
    if (a == s && b != t) {
      int fa = dsu.find(b);
      if (!dsu.same(a, b) && viss[fa] && !vist[fa] && !vis[fa]) {
        dsu.unite(a, b);
        ans.push_back(e[i]);
        d[a]++, d[b]++;
        vis[fa] = 1;
      }
    } else if (b == s && a != t) {
      int fa = dsu.find(a);
      if (!dsu.same(a, b) && viss[fa] && !vist[fa] && !vis[fa]) {
        dsu.unite(a, b);
        d[a]++, d[b]++;
        ans.push_back(e[i]);
        vis[fa] = 1;
      }
    }
  }
  for (int i = 1; i <= m; ++i) {
    int a = e[i].first, b = e[i].second;
    if (a == t && b != s) {
      int fa = dsu.find(b);
      if (!dsu.same(a, b) && !viss[fa] && vist[fa] && !vis[fa]) {
        dsu.unite(a, b);
        ans.push_back(e[i]);
        d[a]++, d[b]++;
        vis[fa] = 1;
      }
    } else if (b == t && a != s) {
      int fa = dsu.find(a);
      if (!dsu.same(a, b) && !viss[fa] && vist[fa] && !vis[fa]) {
        dsu.unite(a, b);
        d[a]++, d[b]++;
        ans.push_back(e[i]);
        vis[fa] = 1;
      }
    }
  }
  for (int i = 1; i <= m; ++i) {
    int a = e[i].first, b = e[i].second;
    if (a == s && b == t) continue;
    if (a == t && b == s) continue;
    if (!dsu.same(a, b)) {
      if (a == s && d[s] >= ds) continue;
      if (b == s && d[s] >= ds) continue;
      if (a == t && d[t] >= dt) continue;
      if (b == t && d[t] >= dt) continue;
      dsu.unite(a, b);
      d[a]++;
      d[b]++;
      ans.push_back(e[i]);
    }
  }
  for (int i = 1; i <= m; ++i) {
    int a = e[i].first, b = e[i].second;
    if (!dsu.same(a, b)) {
      dsu.unite(a, b);
      d[a]++;
      d[b]++;
      ans.push_back(e[i]);
    }
  }
  for (int i = 1; i <= m; ++i) {
    int a = e[i].first, b = e[i].second;
    if (!dsu.same(a, b)) {
      cout << "No";
      return 0;
    }
  }
  if (d[s] > ds || d[t] > dt)
    cout << "No";
  else {
    cout << "Yes" << '\n';
    for (auto p : ans) cout << p.first << ' ' << p.second << '\n';
  }
}
