#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 5;
int n, m, s, t, ds, dt;
vector<int> G[N];
vector<pair<int, int> > ans;
int f[N], ls[N], lt[N];
inline int rd() {
  int f = 1, x = 0;
  char c = getchar();
  while (c < '0' || '9' < c) {
    if (c == '-') f = -f;
    c = getchar();
  }
  while ('0' <= c && c <= '9')
    x = (x << 3) + (x << 1) + (c ^ 48), c = getchar();
  return f * x;
}
int Find(int x) { return f[x] == x ? x : Find(f[x]); }
bool Union(int u, int v) {
  int x = Find(u), y = Find(v);
  if (x == y) return false;
  if (x < y)
    f[y] = x;
  else
    f[x] = y;
  return true;
}
void Init() {
  for (int i = 1; i <= n; i++) f[i] = i;
}
int main() {
  n = rd(), m = rd();
  for (int i = 1; i <= m; i++) {
    int u = rd(), v = rd();
    G[u].push_back(v);
    G[v].push_back(u);
  }
  s = rd(), t = rd(), ds = rd(), dt = rd();
  Init();
  for (int u = 1; u <= n; u++) {
    if (u == s || u == t) continue;
    for (int i = 0; i < G[u].size(); i++) {
      int v = G[u][i];
      if (v == s || v == t) continue;
      if (Union(u, v)) ans.push_back(make_pair(u, v));
    }
  }
  for (int i = 0; i < G[s].size(); i++)
    if (G[s][i] != t) {
      int x = Find(G[s][i]);
      ls[x] = G[s][i];
    }
  for (int i = 0; i < G[t].size(); i++)
    if (G[t][i] != s) {
      int x = Find(G[t][i]);
      lt[x] = G[t][i];
    }
  for (int i = 1; i <= n; i++) {
    if (ls[i] && !lt[i]) {
      ds--;
      Union(s, i);
      ans.push_back(make_pair(s, ls[i]));
    } else if (!ls[i] && lt[i]) {
      dt--;
      Union(t, i);
      ans.push_back(make_pair(t, lt[i]));
    }
    if (ds < 0 || dt < 0) return 0 * puts("No");
  }
  for (int i = 1; i <= n; i++)
    if (ls[i] && lt[i]) {
      if (ds && Union(s, i)) {
        ds--;
        ans.push_back(make_pair(s, ls[i]));
      }
      if (dt && Union(t, i)) {
        dt--;
        ans.push_back(make_pair(t, lt[i]));
      }
      if (Find(s) != Find(i) || Find(t) != Find(i)) return 0 * puts("No");
    }
  if (Find(s) != Find(t)) {
    bool f = 0;
    for (int i = 0; i < G[s].size(); i++)
      if (G[s][i] == t) {
        f = 1;
        break;
      }
    if (ds && dt && f) ans.push_back(make_pair(s, t));
    if (!f) return 0 * puts("No");
  }
  if (ans.size() != n - 1) return 0 * puts("No");
  puts("Yes");
  for (int i = 0; i < ans.size(); i++)
    printf("%d %d\n", ans[i].first, ans[i].second);
}
