#include <bits/stdc++.h>
struct node {
  int v;
  node *next;
} edge[400000 * 2 + 10], *adj[200000 + 10], *ecnt = &edge[0];
struct Edge {
  int u, v;
  Edge() {}
  Edge(int u, int v) : u(u), v(v) {}
} e[400000 + 10], ans[400000 + 10];
int n, m, s, t, ds, dt, col[200000 + 10], cntcol, cnta, fa[200000 + 10],
    belong[200000 + 10];
int able[2][200000 + 10], link[2][200000 + 10];
template <class T>
void Read(T &x) {
  char c;
  while (c = getchar(), c != EOF)
    if (c >= '0' && c <= '9') {
      x = c - '0';
      while (c = getchar(), c >= '0' && c <= '9') x = x * 10 + c - '0';
      ungetc(c, stdin);
      return;
    }
}
void read() {
  Read(n), Read(m);
  for (int i = 1; i <= m; i++) Read(e[i].u), Read(e[i].v);
  Read(s), Read(t), Read(ds), Read(dt);
}
void addedge(int u, int v) {
  node *p = ++ecnt;
  p->v = v;
  p->next = adj[u];
  adj[u] = p;
}
void dfs(int u) {
  col[u] = cntcol;
  for (node *p = adj[u]; p; p = p->next)
    if (!col[p->v]) dfs(p->v);
}
int Find(int x) { return x == fa[x] ? x : fa[x] = Find(fa[x]); }
void solve() {
  for (int i = 1; i <= n; i++) fa[i] = i;
  for (int i = 1; i <= m; i++) {
    if (e[i].u == s || e[i].u == t || e[i].v == s || e[i].v == t) continue;
    if (Find(e[i].u) != Find(e[i].v)) {
      fa[Find(e[i].u)] = Find(e[i].v);
      ans[++cnta] = e[i];
      addedge(e[i].u, e[i].v), addedge(e[i].v, e[i].u);
    }
  }
  for (int i = 1; i <= n; i++)
    if (!col[i]) {
      ++cntcol;
      dfs(i);
    }
  for (int i = 1; i <= m; i++)
    if (e[i].u == s || e[i].u == t || e[i].v == s || e[i].v == t)
      addedge(e[i].u, e[i].v), addedge(e[i].v, e[i].u);
  int cnts = 0, cntt = 0;
  belong[col[s]]++;
  for (node *p = adj[s]; p; p = p->next)
    if (!belong[col[p->v]]) belong[col[p->v]]++;
  belong[col[t]]++;
  for (node *p = adj[t]; p; p = p->next)
    if (!belong[col[p->v]]) {
      ans[++cnta] = Edge(t, p->v), cntt++;
      belong[col[p->v]] = -1;
    } else if (belong[col[p->v]] == 1) {
      belong[col[p->v]]++;
      able[1][col[p->v]] = p->v;
    }
  for (node *p = adj[s]; p; p = p->next)
    if (belong[col[p->v]] == 1) {
      ans[++cnta] = Edge(s, p->v), cnts++;
      belong[col[p->v]] = -1;
    } else if (belong[col[p->v]] == 2)
      able[0][col[p->v]] = p->v;
  if (cnts > ds || cntt > dt)
    puts("No");
  else {
    ds -= cnts, dt -= cntt;
    bool f = false;
    for (node *p = adj[s]; p; p = p->next)
      if (belong[col[p->v]] == 2 && ds && p->v != t) {
        ds--;
        ans[++cnta] = Edge(s, p->v);
        link[0][col[p->v]] = p->v;
        belong[col[p->v]] = 0;
      }
    if (ds && dt && belong[col[t]] == 2) {
      f = true;
      ans[++cnta] = Edge(s, t);
      belong[col[s]] = 0;
      dt--;
    }
    for (node *p = adj[t]; p; p = p->next)
      if (belong[col[p->v]] == 2 && p->v != s) {
        if (!dt) {
          puts("No");
          return;
        }
        dt--;
        ans[++cnta] = Edge(t, p->v);
        link[1][col[p->v]] = p->v;
        belong[col[p->v]] = 0;
      }
    if (!f && dt && ds && belong[col[s]] == 2) {
      f = true;
      ans[++cnta] = Edge(s, t);
      ds--;
    }
    if (!f && (ds || dt)) {
      if (ds) {
        for (int i = 1; i <= cntcol; i++)
          if (able[0][i] && link[1][i]) {
            f = true;
            ans[++cnta] = Edge(s, able[0][i]);
            break;
          }
      }
      if (!f && dt) {
        for (int i = 1; i <= cntcol; i++)
          if (able[1][i] && link[0][i]) {
            f = true;
            ans[++cnta] = Edge(t, able[1][i]);
            break;
          }
      }
    }
    if (f) {
      puts("Yes");
      for (int i = 1; i <= cnta; i++) printf("%d %d\n", ans[i].u, ans[i].v);
    } else
      puts("No");
  }
}
int main() {
  read();
  solve();
  return 0;
}
