#include <bits/stdc++.h>
using namespace std;
int n, m;
int s, t, ds, dt;
struct edge {
  int u, v;
} E[400005];
vector<int> vecr[200005];
int pre[200005];
int find(int x) {
  if (x != pre[x]) pre[x] = find(pre[x]);
  return pre[x];
}
void Union(int x, int y) { pre[find(x)] = find(y); }
int cpts[200005];
int tot;
int conts[200005];
int contt[200005];
map<int, int> to;
vector<int> dhas;
vector<int> ans;
void output(int pos) {
  int siz = vecr[pos].size();
  for (int i = 0; i < siz; i++) {
    int u = E[vecr[pos][i]].u;
    int v = E[vecr[pos][i]].v;
    if (find(u) == find(v))
      continue;
    else {
      Union(u, v);
      ans.push_back(vecr[pos][i]);
    }
  }
}
int main() {
  scanf("%d%d", &n, &m);
  for (int i = 1; i <= n; i++) pre[i] = i;
  for (int i = 0; i < m; i++) scanf("%d%d", &E[i].u, &E[i].v);
  scanf("%d%d%d%d", &s, &t, &ds, &dt);
  for (int i = 0; i < m; i++) {
    if (E[i].u == s || E[i].u == t || E[i].v == s || E[i].v == t)
      continue;
    else if (find(E[i].u) != find(E[i].v)) {
      Union(E[i].u, E[i].v);
    }
  }
  for (int i = 1; i <= n; i++)
    if (i != s && i != t) cpts[tot++] = find(i);
  sort(cpts, cpts + tot);
  tot = unique(cpts, cpts + tot) - cpts;
  cpts[tot++] = s;
  cpts[tot++] = t;
  for (int i = 0; i < tot; i++) to[cpts[i]] = i;
  memset(conts, -1, sizeof(conts));
  memset(contt, -1, sizeof(contt));
  for (int i = 0; i < m; i++) {
    if (E[i].u == s) conts[to[find(E[i].v)]] = i;
    if (E[i].v == s) conts[to[find(E[i].u)]] = i;
    if (E[i].u == t) contt[to[find(E[i].v)]] = i;
    if (E[i].v == t) contt[to[find(E[i].u)]] = i;
    if (find(E[i].u) == find(E[i].v)) vecr[to[find(E[i].u)]].push_back(i);
  }
  for (int i = 1; i <= n; i++) pre[i] = i;
  for (int i = 0; i < tot - 2; i++) {
    output(i);
    if (conts[i] >= 0 && contt[i] >= 0)
      dhas.push_back(i);
    else if (conts[i] >= 0) {
      ans.push_back(conts[i]);
      ds--;
    } else if (contt[i] >= 0) {
      ans.push_back(contt[i]);
      dt--;
    }
  }
  if (dhas.size() == 0) {
    ds--;
    dt--;
    ans.push_back(conts[tot - 1]);
    if (ds < 0 || dt < 0)
      printf("No\n");
    else {
      printf("Yes\n");
      for (int i = 0; i < ans.size(); i++) {
        printf("%d %d\n", E[ans[i]].u, E[ans[i]].v);
      }
    }
  } else {
    for (int i = 0; i < dhas.size(); i++) {
      if (i == 0) {
        ans.push_back(conts[dhas[i]]);
        ans.push_back(contt[dhas[i]]);
        ds--;
        dt--;
      } else {
        if (ds < dt) {
          ans.push_back(contt[dhas[i]]);
          dt--;
        } else {
          ans.push_back(conts[dhas[i]]);
          ds--;
        }
      }
    }
    if (ds < 0 || dt < 0)
      printf("No\n");
    else {
      printf("Yes\n");
      for (int i = 0; i < ans.size(); i++) {
        printf("%d %d\n", E[ans[i]].u, E[ans[i]].v);
      }
    }
  }
  return 0;
}
