#include <bits/stdc++.h>
using namespace std;
const int MAXN = 200010;
const int MAXM = 400010;
int n, m, s, t, ds, dt, fa[MAXN], e[MAXM][2], mst[MAXM][2], cnt = 0, csn[MAXN],
                                                            ctn[MAXN];
vector<int> adj[MAXN];
bool cs[MAXN] = {0}, ct[MAXN] = {0}, vs[MAXN] = {0}, vt[MAXN] = {0}, fst = 1;
template <class T>
void read(T &a) {
  T x = 0, f = 1;
  char ch = getchar();
  while (ch < '0' || ch > '9') {
    if (ch == '-') f = -f;
    ch = getchar();
  }
  while (ch >= '0' && ch <= '9') {
    x = x * 10 + ch - '0';
    ch = getchar();
  }
  a = x * f;
}
inline void addedge(int u, int v) { adj[u].push_back(v), adj[v].push_back(u); }
inline int getfa(int x) { return x == fa[x] ? x : fa[x] = getfa(fa[x]); }
inline void addmst(int u, int v) { mst[++cnt][0] = u, mst[cnt][1] = v; }
int main() {
  read(n), read(m);
  for (int u, v, i = 1; i <= m; i++) {
    read(u), read(v);
    addedge(u, v);
    e[i][0] = u, e[i][1] = v;
  }
  read(s), read(t), read(ds), read(dt);
  for (int i = 1; i <= n; i++) fa[i] = i;
  for (int i = 1; i <= m; i++)
    if (e[i][0] != s && e[i][1] != s && e[i][0] != t && e[i][1] != t) {
      int u = getfa(e[i][0]), v = getfa(e[i][1]);
      if (u != v) fa[u] = v, addmst(e[i][0], e[i][1]);
    }
  int size = adj[s].size();
  for (int i = 0; i < size; i++)
    cs[getfa(adj[s][i])] = 1, csn[getfa(adj[s][i])] = adj[s][i];
  size = adj[t].size();
  for (int i = 0; i < size; i++)
    ct[getfa(adj[t][i])] = 1, ctn[getfa(adj[t][i])] = adj[t][i];
  for (int i = 1; i <= n; i++)
    if (i != s && i != t) {
      if (!cs[getfa(i)] && !ct[getfa(i)]) return puts("No"), 0;
      if (cs[getfa(i)] && !ct[getfa(i)] && !vs[getfa(i)]) {
        addmst(s, csn[getfa(i)]), vs[getfa(i)] = 1;
        if (--ds < 0) return puts("No"), 0;
      }
      if (!cs[getfa(i)] && ct[getfa(i)] && !vt[getfa(i)]) {
        addmst(t, ctn[getfa(i)]), vt[getfa(i)] = 1;
        if (--dt < 0) return puts("No"), 0;
      }
    }
  bool flag = 0;
  for (int i = 1; i <= n; i++)
    if (i != s && i != t) {
      if (cs[getfa(i)] && ct[getfa(i)]) {
        flag = 1;
        break;
      }
    }
  if (!flag) {
    addmst(s, t);
    if (--ds < 0) return puts("No"), 0;
    if (--dt < 0) return puts("No"), 0;
  } else {
    for (int i = 1; i <= n; i++)
      if (i != s && i != t) {
        if (!fst && cs[getfa(i)] && ct[getfa(i)] && !vs[getfa(i)] &&
            !vt[getfa(i)]) {
          if (ds > dt) {
            addmst(s, csn[getfa(i)]);
            if (--ds < 0) return puts("No"), 0;
          } else {
            addmst(t, ctn[getfa(i)]);
            if (--dt < 0) return puts("No"), 0;
          }
          vs[getfa(i)] = vt[getfa(i)] = 1;
        } else if (cs[getfa(i)] && ct[getfa(i)] && !vs[getfa(i)] &&
                   !vt[getfa(i)]) {
          addmst(s, csn[getfa(i)]), addmst(t, ctn[getfa(i)]);
          if (--ds < 0) return puts("No"), 0;
          if (--dt < 0) return puts("No"), 0;
          fst = 0;
          vs[getfa(i)] = vt[getfa(i)] = 1;
        }
      }
  }
  puts("Yes");
  for (int i = 1; i <= cnt; i++) printf("%d %d\n", mst[i][0], mst[i][1]);
  return 0;
}
