#include <bits/stdc++.h>
#pragma GCC optimize(2)
#pragma GCC optimize(3)
using namespace std;
int read() {
  int f = 1, x = 0;
  char c = getchar();
  while (c < '0' || '9' < c) {
    if (c == '-') f = -1;
    c = getchar();
  }
  while ('0' <= c && c <= '9') {
    x = x * 10 + c - '0';
    c = getchar();
  }
  return f * x;
}
struct Edge {
  int u, v, fu, fv, val;
  friend bool operator<(Edge a, Edge b) { return a.val < b.val; }
} edge[400000 + 5];
pair<int, int> ans[200000 + 5];
map<pair<int, int>, bool> Map;
int d[200000 + 5], fa[200000 + 5], at[200000 + 5][2];
int Find(int u) { return fa[u] == u ? u : (fa[u] = Find(fa[u])); }
int main() {
  int n = read(), m = read(), cnt = 0;
  for (int i = 1; i <= m; i++) edge[i].u = read(), edge[i].v = read();
  int s = read(), t = read(), ds = read(), dt = read();
  bool t2 = 0;
  for (int i = 1; i <= m; i++) {
    if ((edge[i].u == s && edge[i].v == t) ||
        (edge[i].u == t && edge[i].v == s))
      t2 = 1, edge[i].val = 2;
    else if (edge[i].u != s && edge[i].u != t && edge[i].v != s &&
             edge[i].v != t)
      edge[i].val = 0;
    else
      edge[i].val = 1;
  }
  sort(edge + 1, edge + m + 1);
  for (int i = 1; i <= n; i++) fa[i] = i;
  for (int i = 1; i <= m; i++)
    if (!edge[i].val) {
      int u = Find(edge[i].u), v = Find(edge[i].v);
      if (u != v) ans[++cnt] = make_pair(edge[i].u, edge[i].v), fa[u] = v;
    }
  for (int i = 1; i <= m; i++)
    edge[i].fu = Find(edge[i].u), edge[i].fv = Find(edge[i].v);
  for (int i = 1; i <= m; i++)
    if (edge[i].val == 1 && !Map.count(make_pair(edge[i].fu, edge[i].fv))) {
      at[edge[i].fu][min(d[edge[i].fu], 1)] =
          at[edge[i].fv][min(d[edge[i].fv], 1)] = i;
      d[edge[i].fu]++, d[edge[i].fv]++;
      Map[make_pair(edge[i].fu, edge[i].fv)] = 1;
      Map[make_pair(edge[i].fv, edge[i].fu)] = 1;
    }
  int con2 = 0;
  for (int i = 1; i <= n; i++)
    if (i != s && i != t) {
      if (d[i] == 1) {
        ans[++cnt] = make_pair(edge[at[i][0]].u, edge[at[i][0]].v);
        if (edge[at[i][0]].u == s || edge[at[i][0]].v == s)
          ds--;
        else
          dt--;
      } else if (d[i])
        con2 = 1;
    }
  if (!con2)
    ans[++cnt] = make_pair(s, t), ds--, dt--;
  else {
    for (int i = 1; i <= n; i++)
      if (i != s && i != t && d[i] == 2) {
        ans[++cnt] = make_pair(edge[at[i][0]].u, edge[at[i][0]].v);
        ans[++cnt] = make_pair(edge[at[i][1]].u, edge[at[i][1]].v);
        ds--, dt--;
        break;
      }
    bool ti = 0;
    for (int i = 1; i <= n; i++)
      if (i != s && i != t && d[i] == 2) {
        if (!ti)
          ti = 1;
        else {
          if (ds > 0) {
            if (edge[at[i][0]].u == s || edge[at[i][0]].v == s)
              ans[++cnt] = make_pair(edge[at[i][0]].u, edge[at[i][0]].v);
            else
              ans[++cnt] = make_pair(edge[at[i][1]].u, edge[at[i][1]].v);
            ds--;
          } else if (dt > 0) {
            if (edge[at[i][0]].u == t || edge[at[i][0]].v == t)
              ans[++cnt] = make_pair(edge[at[i][0]].u, edge[at[i][0]].v);
            else
              ans[++cnt] = make_pair(edge[at[i][1]].u, edge[at[i][1]].v);
            dt--;
          }
        }
      }
  }
  if (cnt != n - 1 || ds < 0 || dt < 0) puts("No"), exit(0);
  puts("Yes");
  for (int i = 1; i < n; i++) printf("%d %d\n", ans[i].first, ans[i].second);
  return 0;
}
