#include <bits/stdc++.h>
using namespace std;
template <typename Arg1>
void __f(const char* name, Arg1&& arg1) {
  cerr << name << " : " << arg1 << endl;
}
template <typename Arg1, typename... Args>
void __f(const char* names, Arg1&& arg1, Args&&... args) {
  const char* comma = strchr(names + 1, ',');
  cerr.write(names, comma - names) << " : " << arg1 << " | ";
  __f(comma + 1, args...);
}
float inf = std::numeric_limits<double>::infinity();
long long int INF = std::numeric_limits<long long int>::max();
const int N = 200005;
int V[N], CMP[N];
int CON[2][N];
vector<int> G[N];
int s, t;
vector<int> ST[2];
vector<pair<int, int> > SH;
inline void dfs(int x, int c) {
  V[x] = 1;
  CMP[x] = c;
  for (auto i : G[x])
    if (!V[i] && i != s && i != t) dfs(i, c);
}
inline void print_cmp(int x) {
  V[x] = 1;
  for (auto i : G[x])
    if (!V[i] && i != s && i != t) printf("%d %d\n", x, i), print_cmp(i);
}
int main() {
  int n, m;
  scanf("%d", &n);
  scanf("%d", &m);
  int u, v;
  while (m--) {
    scanf("%d", &u);
    scanf("%d", &v);
    G[u].push_back(v);
    G[v].push_back(u);
  }
  int ds, dt, C = 1;
  scanf("%d", &s);
  scanf("%d", &t);
  scanf("%d", &ds);
  scanf("%d", &dt);
  for (int i = 1; i <= n; i++)
    if (!V[i] && i != s && i != t) dfs(i, C++);
  for (auto i : G[s]) CON[0][CMP[i]] = i;
  for (auto i : G[t]) CON[1][CMP[i]] = i;
  for (int i = 1; i < C; i++) {
    if (!CON[0][i] && !CON[1][i])
      return 0 * printf("No\n");
    else if (CON[0][i] && CON[1][i])
      SH.push_back({CON[0][i], CON[1][i]});
    else if (CON[0][i])
      ST[0].push_back(CON[0][i]);
    else if (CON[1][i])
      ST[1].push_back(CON[1][i]);
  }
  if (ST[0].size() > +ds - 1 || ST[1].size() >= dt ||
      ST[0].size() + ST[1].size() + SH.size() >= ds + dt)
    return 0 * printf("No\n");
  memset(V, 0, sizeof(V));
  if (SH.size() == 0) {
    if (find(G[s].begin(), G[s].end(), t) == G[s].end())
      return 0 * printf("No\n");
    else
      printf("Yes\n%d %d\n", s, t);
  } else {
    printf("Yes\n");
    printf("%d %d\n%d %d\n", s, SH[0].first, t, SH[0].second);
    print_cmp(SH[0].first);
  }
  for (auto i : ST[0]) {
    printf("%d %d\n", s, i);
    print_cmp(i);
  }
  for (auto i : ST[1]) {
    printf("%d %d\n", t, i);
    print_cmp(i);
  }
  ds -= (ST[0].size() + 1);
  int ii = 1;
  for (ii = 1; ii <= ds && ii < SH.size(); ii++) {
    printf("%d %d\n", s, SH[ii].first);
    print_cmp(SH[ii].first);
  }
  for (; ii < SH.size(); ii++) {
    printf("%d %d\n", t, SH[ii].second);
    print_cmp(SH[ii].second);
  }
  return 0;
}
