#include <bits/stdc++.h>
using namespace std;
const int MAXN = 200005;
const int MAXE = 400005;
const int INF = 0x3f3f3f3f;
struct Edge {
  int u, v, c, f;
  Edge() {}
  Edge(int u, int v, int c, int f) : u(u), v(v), c(c), f(f) {}
  bool operator<(const Edge& a) const { return f < a.f; }
};
Edge E[MAXE];
int n, m, s, t, ds, dt;
int p[MAXN], used[MAXE], eu[MAXE], ev[MAXE];
int be[MAXN][2];
int F(int x) { return p[x] == x ? x : (p[x] = F(p[x])); }
void solve() {
  for (int i = 1; i <= n; ++i) {
    p[i] = i;
    be[i][0] = be[i][1] = 0;
  }
  for (int i = 1; i <= m; ++i) {
    scanf("%d%d", &eu[i], &ev[i]);
  }
  scanf("%d%d%d%d", &s, &t, &ds, &dt);
  for (int i = 1; i <= m; ++i) {
    int u = eu[i], v = ev[i];
    int f = 0;
    if (v == s || v == t) swap(u, v);
    if (u == s || u == t || v == s || v == t) f = 1;
    if (u == s && v == t || u == t && v == s) f = 2;
    E[i] = Edge(u, v, i, f);
    used[i] = 0;
  }
  sort(E + 1, E + m + 1);
  int cnt = n;
  for (int i = 1; i <= m; ++i) {
    if (E[i].f == 0) {
      int x = F(E[i].u);
      int y = F(E[i].v);
      if (x == y) continue;
      --cnt;
      p[x] = y;
      used[E[i].c] = 1;
    } else if (E[i].f == 1) {
      if (E[i].u == s)
        be[F(E[i].v)][0] = E[i].c;
      else
        be[F(E[i].v)][1] = E[i].c;
    } else
      break;
  }
  for (int i = 1; i <= n; ++i)
    if (i != s && i != t && i == F(i)) {
      if (be[i][0] && be[i][1])
        continue;
      else if (be[i][0]) {
        if (ds) {
          --ds;
          --cnt;
          used[be[i][0]] = 1;
        } else {
          printf("No\n");
          return;
        }
      } else if (be[i][1]) {
        if (dt) {
          --dt;
          --cnt;
          used[be[i][1]] = 1;
        } else {
          printf("No\n");
          return;
        }
      } else {
        printf("No\n");
        return;
      }
    }
  for (int i = 1; i <= n; ++i)
    if (i != s && i != t && i == F(i)) {
      if (be[i][0] && be[i][1]) {
        if (ds) {
          --ds;
          --cnt;
          used[be[i][0]] = 1;
        } else if (dt) {
          --dt;
          --cnt;
          used[be[i][1]] = 1;
        } else {
          printf("No\n");
          return;
        }
      }
    }
  if (cnt > 1) {
    for (int i = 1; i <= n; ++i)
      if (i != s && i != t && i == F(i)) {
        if (be[i][0] && be[i][1]) {
          if (ds && used[be[i][0]] == 0) {
            --ds;
            --cnt;
            used[be[i][0]] = 1;
            p[s] = t;
            break;
          } else if (dt && used[be[i][1]] == 0) {
            --dt;
            --cnt;
            used[be[i][1]] = 1;
            p[s] = t;
            break;
          } else {
            printf("No\n");
            return;
          }
        }
      }
    if (cnt > 1) {
      if (E[m].f != 2) {
        printf("No\n");
        return;
      }
      int x = F(s);
      int y = F(t);
      if (!ds || !dt) {
        printf("No\n");
        return;
      }
      used[E[m].c] = 1;
    }
  }
  printf("Yes\n");
  for (int i = 1; i <= m; ++i)
    if (used[i]) {
      printf("%d %d\n", eu[i], ev[i]);
    }
}
int main() {
  while (~scanf("%d%d", &n, &m)) solve();
  return 0;
}
