#include <bits/stdc++.h>
using namespace std;
const int N = 200005;
void println() { cout << '\n'; }
template <typename T, typename... Ts>
void println(const T& value, const Ts&... values) {
  cout << value << ' ';
  println(values...);
}
struct dsu {
  vector<int> par, sz;
  void init(int n) {
    par.assign(n + 5, 0);
    sz.assign(n + 5, 1);
    for (int i = (0); i <= (par.size() - 1); i++) par[i] = i;
  }
  int find(int x) { return par[x] == x ? x : find(par[x]); }
  void uni(int x, int y) {
    x = find(x);
    y = find(y);
    if (x != y) {
      if (sz[x] > sz[y]) swap(x, y);
      sz[y] += sz[x];
      sz[x] = 0;
      par[x] = y;
    }
  }
} small;
struct data__ {
  int u, v;
  data__(int _u, int _v) : u(_u), v(_v){};
};
vector<data__> edge;
vector<data__> ans;
int n, m;
int S, T, limS = 0, limT = 0;
pair<int, int> con[N];
bool SaT;
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  cin >> n >> m;
  for (int i = 1; i <= m; i++) {
    int x, y;
    cin >> x >> y;
    edge.push_back(data__(x, y));
  }
  cin >> S >> T >> limS >> limT;
  small.init(n);
  for (int i = 0; i < m; i++) {
    int u = edge[i].u;
    int v = edge[i].v;
    if (u != S && u != T && v != S && v != T)
      if (small.find(u) != small.find(v)) {
        small.uni(u, v);
        ans.push_back(edge[i]);
      }
    if ((u == S && v == T) || (u == T && v == S)) {
      SaT = true;
      continue;
    }
  }
  for (int i = 0; i < m; i++) {
    int u = edge[i].u;
    int v = edge[i].v;
    if ((u == S && v == T) || (u == T && v == S)) continue;
    if (u == S || v == S) {
      if (v == S) swap(u, v);
      if (!con[small.find(v)].first || con[small.find(v)].first == S)
        con[small.find(v)] = make_pair(S, i);
      else
        con[small.find(v)] = make_pair(-1, -1);
    }
    if (u == T || v == T) {
      if (v == T) swap(u, v);
      if (!con[small.find(v)].first || con[small.find(v)].first == T)
        con[small.find(v)] = make_pair(T, i);
      else
        con[small.find(v)] = make_pair(-1, -1);
    }
  }
  for (int i = 1; i <= n; i++) {
    if (con[i].first == S) {
      limS--;
      ans.push_back(edge[con[i].second]);
      small.uni(edge[con[i].second].u, edge[con[i].second].v);
    } else if (con[i].first == T) {
      limT--;
      ans.push_back(edge[con[i].second]);
      small.uni(edge[con[i].second].u, edge[con[i].second].v);
    }
  }
  for (int i = 0; i < m; i++) {
    int u = edge[i].u;
    int v = edge[i].v;
    if ((u == S && v == T) || (u == T && v == S)) continue;
    if (small.find(u) != small.find(v)) {
      if (u == S || v == S) {
        if (limS == 0) continue;
        limS--;
      }
      if (u == T || v == T) {
        if (limT == 0) continue;
        limT--;
      }
      small.uni(u, v);
      ans.push_back(edge[i]);
    }
  }
  if (small.find(S) != small.find(T) && limS > 0 && limT > 0) {
    small.uni(S, T);
    ans.push_back(data__(S, T));
  }
  if (limS < 0 || limT < 0) return cout << "No", 0;
  for (int i = 1; i <= n - 1; i++)
    if (small.find(i) != small.find(i + 1)) return cout << "No", 0;
  cout << "Yes" << '\n';
  for (int i = 0; i < ans.size(); i++)
    cout << ans[i].u << ' ' << ans[i].v << '\n';
}
