#include <bits/stdc++.h>
using namespace std;
const int MXN = 2e5 + 100, MXM = 4e5 + 100;
struct elist {
  int v, last;
} e[MXM + MXM];
int zh[MXN], tote;
void adde(int u, int v) {
  e[tote].v = v;
  e[tote].last = zh[u];
  zh[u] = tote++;
}
int s, t;
bool valid[MXM + MXM], vis[MXN];
void dfs(int u) {
  vis[u] = 1;
  for (int i = zh[u]; i != -1; i = e[i].last) {
    int v = e[i].v;
    if (vis[v] == 0 &&
        (u != s && u != t && v != s && v != t || valid[i] || valid[i ^ 1])) {
      printf("%d %d\n", u, v);
      dfs(v);
    }
  }
}
int fa[MXN];
int getfather(int x) {
  if (fa[x] == x) return x;
  return fa[x] = getfather(fa[x]);
}
int S[MXN], T[MXN];
bool tmp[MXN];
int main() {
  memset(zh, -1, sizeof(zh));
  tote = 0;
  memset(S, -1, sizeof(S));
  memset(T, -1, sizeof(T));
  int n, m, u, v, ds, dt, num;
  bool ST = 0;
  scanf("%d%d", &n, &m);
  for (int i = 1; i <= n; i++) fa[i] = i;
  while (m--) {
    scanf("%d%d", &u, &v);
    adde(u, v);
    adde(v, u);
  }
  scanf("%d%d%d%d", &s, &t, &ds, &dt);
  for (int i = 0; i < tote; i += 2) {
    if (e[i].v == s && e[i ^ 1].v == t || e[i].v == t && e[i ^ 1].v == s)
      num = i;
    if (e[i ^ 1].v != s && e[i ^ 1].v != t && e[i].v != s && e[i].v != t) {
      int fu = getfather(e[i ^ 1].v), fv = getfather(e[i].v);
      if (fu != fv) fa[fu] = fv;
    }
  }
  for (int i = zh[s]; i != -1; i = e[i].last) {
    if (e[i].v != t) {
      int fv = getfather(e[i].v);
      S[fv] = i;
    }
  }
  for (int i = zh[t]; i != -1; i = e[i].last) {
    if (e[i].v != s) {
      int fv = getfather(e[i].v);
      T[fv] = i;
    }
  }
  for (int i = 1; i <= n; i++) {
    if (i != s && i != t) {
      int fi = getfather(i);
      if (tmp[fi]) continue;
      if (S[fi] >= 0 && T[fi] == -1) {
        ds--;
        valid[S[fi]] = 1;
        tmp[fi] = 1;
      }
      if (S[fi] == -1 && T[fi] >= 0) {
        dt--;
        valid[T[fi]] = 1;
        tmp[fi] = 1;
      }
    }
  }
  for (int i = 1; i <= n; i++)
    if (i != s && i != t) {
      int fi = getfather(i);
      if (tmp[fi]) continue;
      if (S[fi] >= 0 && T[fi] >= 0) {
        tmp[fi] = 1;
        if (!ST) {
          ds--;
          dt--;
          valid[S[fi]] = 1;
          valid[T[fi]] = 1;
          ST = 1;
        } else {
          if (ds > dt) {
            ds--;
            valid[S[fi]] = 1;
          } else {
            dt--;
            valid[T[fi]] = 1;
          }
        }
      }
    }
  if (!ST) {
    ds--;
    dt--;
    valid[num] = 1;
    ST = 1;
  }
  if (ds >= 0 && dt >= 0) {
    printf("Yes\n");
    dfs(s);
  } else
    printf("No\n");
  return 0;
}
