#include <bits/stdc++.h>
using namespace std;
pair<vector<vector<int>>, vector<vector<pair<int, int>>>> spanningTrees(
    const vector<vector<int>> &G) {
  int V = (int)G.size();
  vector<bool> vis(V);
  queue<pair<int, int>> que;
  vector<vector<int>> ccs;
  vector<vector<pair<int, int>>> eds;
  for (int i = 0; i < V; ++i) {
    if (!vis[i]) {
      vector<int> cc;
      vector<pair<int, int>> ed;
      que.push(make_pair(-1, i));
      while (!que.empty()) {
        int u, p;
        tie(p, u) = que.front();
        que.pop();
        if (vis[u]) continue;
        vis[u] = true;
        cc.push_back(u);
        if (p != -1) ed.emplace_back(p, u);
        for (int v : G[u])
          if (!vis[v]) {
            que.push(make_pair(u, v));
          }
      }
      ccs.push_back(cc);
      eds.push_back(ed);
    }
  }
  return make_pair(ccs, eds);
}
int n, m, s, t, ds, dt;
int main() {
  cin >> n >> m;
  vector<int> su(n + 1), tu(n + 1), uu(m), vv(m);
  vector<vector<int>> G(n + 1);
  for (int(i) = (0); (i) < (int)(m); ++(i)) {
    scanf("%d%d", &uu[i], &vv[i]);
  }
  cin >> s >> t >> ds >> dt;
  for (int(i) = (0); (i) < (int)(m); ++(i)) {
    if (vv[i] == s || vv[i] == t) swap(uu[i], vv[i]);
    if ((uu[i] == s && vv[i] == t) || (uu[i] == t && vv[i] == s)) {
      su[t] = tu[s] = 1;
    } else if (uu[i] == s) {
      su[vv[i]] = 1;
    } else if (uu[i] == t) {
      tu[vv[i]] = 1;
    } else {
      G[uu[i]].push_back(vv[i]);
      G[vv[i]].push_back(uu[i]);
    }
  }
  vector<pair<int, int>> ans;
  vector<tuple<int, int, int>> st;
  int xs = 0, xt = 0;
  vector<vector<int>> ccs;
  vector<int> cs, ct;
  vector<vector<pair<int, int>>> eds;
  tie(ccs, eds) = spanningTrees(G);
  for (int(i) = (0); (i) < (int)((int)(ccs).size()); ++(i)) {
    auto &cc = ccs[i];
    ans.insert(ans.begin(), (eds[i]).begin(), (eds[i]).end());
    if (cc[0] != 0 && cc[0] != s && cc[0] != t) {
      int sa = -1, ta = -1;
      for (auto &(u) : (cc)) {
        if (su[u]) sa = u;
        if (tu[u]) ta = u;
      }
      if (sa != -1 && ta != -1)
        st.emplace_back(sa, ta, i);
      else if (sa != -1) {
        xs++;
        ans.emplace_back(s, sa);
        cs.insert(cs.begin(), (cc).begin(), (cc).end());
      } else if (ta != -1) {
        xt++;
        ans.emplace_back(t, ta);
        ct.insert(ct.begin(), (cc).begin(), (cc).end());
      }
    }
  }
  for (auto &(p) : (st)) {
    int sa, ta, i;
    tie(sa, ta, i) = p;
    if (xs < ds) {
      xs++, ans.emplace_back(s, sa);
      cs.insert(cs.begin(), (ccs[i]).begin(), (ccs[i]).end());
    } else {
      xt++, ans.emplace_back(t, ta);
      ct.insert(ct.begin(), (ccs[i]).begin(), (ccs[i]).end());
    }
  }
  int sa = -1, ta = -1;
  for (auto &(u) : (ct))
    if (su[u]) sa = u;
  for (auto &(u) : (cs))
    if (tu[u]) ta = u;
  if (sa != -1 && xs < ds)
    ans.emplace_back(s, sa);
  else if (ta != -1 && xt < dt)
    ans.emplace_back(t, ta);
  else if (su[t] && xs < ds && xt < dt)
    ans.emplace_back(s, t);
  else
    xs = ds + 1;
  if (xs > ds || xt > dt)
    puts("No");
  else {
    puts("Yes");
    for (auto &(x) : (ans)) printf("%d %d\n", x.first, x.second);
  }
}
