#include <bits/stdc++.h>
using namespace std;
struct Edge {
  int u, v;
};
const int MAXN = 2e5 + 5;
int p[MAXN];
vector<Edge> edges;
vector<int> G[MAXN];
bool va[MAXN], vb[MAXN];
int find(int x) { return x == p[x] ? x : p[x] = find(p[x]); }
int main() {
  memset(va, 0, sizeof(va));
  memset(vb, 0, sizeof(vb));
  int n, m;
  scanf("%d%d", &n, &m);
  for (int i = 1; i <= n; i++) p[i] = i;
  while (m--) {
    int u, v;
    scanf("%d%d", &u, &v);
    edges.push_back((Edge){u, v});
  }
  int s, t, ds, dt;
  scanf("%d%d%d%d", &s, &t, &ds, &dt);
  vector<Edge> g;
  bool ok = 0;
  for (int i = 0; i < edges.size(); i++) {
    int u = edges[i].u, v = edges[i].v;
    bool flag = 0;
    if (u == s || u == t) G[u].push_back(v), flag = 1;
    if (v == s || v == t) G[v].push_back(u), flag = 1;
    if (flag) continue;
    u = find(u), v = find(v);
    if (u != v) {
      p[v] = u;
      g.push_back((Edge){edges[i].u, edges[i].v});
    }
  }
  for (int i = 0; i < G[s].size(); i++) va[G[s][i]] = 1;
  for (int i = 0; i < G[t].size(); i++) vb[G[t][i]] = 1;
  int as = 0, at = 0;
  for (int i = 0; i < G[s].size(); i++) {
    if (as > ds) break;
    if (G[s][i] == t) {
      ok = 1;
      continue;
    }
    if (vb[G[s][i]]) continue;
    int u = find(s), v = find(G[s][i]);
    if (u != v) {
      as++;
      p[u] = v;
      g.push_back((Edge){s, G[s][i]});
    }
  }
  for (int i = 0; i < G[s].size(); i++) {
    if (as >= ds) break;
    if (G[s][i] == t) {
      ok = 1;
      continue;
    }
    int u = find(s), v = find(G[s][i]);
    if (u != v) {
      as++;
      p[u] = v;
      g.push_back((Edge){s, G[s][i]});
    }
  }
  for (int i = 0; i < G[t].size(); i++) {
    if (at > dt) break;
    if (G[t][i] == s) {
      ok = 1;
      continue;
    }
    int u = find(t), v = find(G[t][i]);
    if (u != v) {
      at++;
      p[u] = v;
      g.push_back((Edge){t, G[t][i]});
    }
  }
  int u = find(s), v = find(t);
  if (u != v) {
    if (ok) {
      g.push_back((Edge){s, t});
      as++;
      at++;
    } else {
      puts("No");
      return 0;
    }
  }
  if (as > ds || at > dt)
    puts("No");
  else {
    puts("Yes");
    for (int i = 0; i < g.size(); i++) {
      printf("%d %d\n", g[i].u, g[i].v);
    }
  }
  return 0;
}
