#include <bits/stdc++.h>
using namespace std;
int n, m, S, T, ds, dt, k, fa[200010], ans, flag, v1[200010], v2[200010];
struct ma {
  int u, v;
} a[200010 * 2], b[200010];
int find(int x) { return fa[x] == x ? x : fa[x] = find(fa[x]); }
void ex() {
  puts("No");
  exit(0);
}
int main() {
  cin >> n >> m;
  for (int i = 1; i <= m; i++) scanf("%d%d", &a[i].u, &a[i].v);
  cin >> S >> T >> ds >> dt;
  for (int i = 1; i <= n; i++) fa[i] = i;
  for (int i = 1; i <= m; i++)
    if (a[i].u != S && a[i].u != T && a[i].v != S && a[i].v != T &&
        find(a[i].u) != find(a[i].v))
      b[++ans] = a[i], fa[find(a[i].u)] = find(a[i].v);
  for (int i = 1; i <= m; i++) {
    if (a[i].u == S && a[i].v == T || a[i].u == T && a[i].v == S)
      flag = i;
    else if (a[i].u == S)
      v1[find(a[i].v)] = i;
    else if (a[i].u == T)
      v2[find(a[i].v)] = i;
    else if (a[i].v == S)
      v1[find(a[i].u)] = i;
    else if (a[i].v == T)
      v2[find(a[i].u)] = i;
  }
  int o = 0;
  for (int i = 1; i <= n; i++)
    if (i != S && i != T && find(i) == i) {
      if (!v1[i] && !v2[i])
        ex();
      else if (v1[i] && !v2[i]) {
        if (!ds) ex();
        b[++ans] = a[v1[i]];
        ds--;
      } else if (!v1[i] && v2[i]) {
        if (!dt) ex();
        b[++ans] = a[v2[i]];
        dt--;
      } else
        o++;
    }
  if (!o) {
    if (!flag || !ds || !dt) ex();
    b[++ans] = a[flag];
    ds--;
    dt--;
  } else {
    if (!ds || !dt || ds + dt < o + 1) ex();
    int s = 0;
    for (int i = 1; i <= n; i++)
      if (i != S && i != T && find(i) == i && v1[i] && v2[i]) {
        s++;
        b[++ans] = a[v1[i]];
        if (s == ds || s == o) {
          for (int j = i; j <= n; j++)
            if (j != S && j != T && find(j) == j && v1[j] && v2[j])
              b[++ans] = a[v2[j]];
          break;
        }
      }
  }
  puts("Yes");
  for (int i = 1; i <= ans; i++) printf("%d %d\n", b[i].u, b[i].v);
}
