#include <bits/stdc++.h>
using namespace std;
struct Edge {
  int u, v, next;
} edge[200010 * 4];
int dau[200010], ll[200010], fst[200010], dem;
void add(int a, int b) {
  edge[dem] = (Edge){a, b, dau[a]};
  dau[a] = dem++;
}
vector<int> ver[200010];
set<int> se;
int vt(int x) { return ll[x] == x ? x : ll[x] = vt(ll[x]); }
int main() {
  int n, m;
  cin >> n >> m;
  memset(dau, -1, sizeof(dau));
  dem = 0;
  for (int i = 0; i < m; i++) {
    int a, b;
    cin >> a >> b;
    add(a, b);
    add(b, a);
  }
  vector<pair<int, int> > ans;
  for (int i = 1; i <= n; i++) {
    ll[i] = i;
    ver[i].clear();
  }
  int s, t, ds, dt;
  cin >> s >> t >> ds >> dt;
  int kt = 0;
  for (int i = 0; i < dem; i += 2) {
    int u = edge[i].u;
    int v = edge[i].v;
    if ((u == s && v == t) || (u == t && v == s)) kt = 1;
    if (u == s || v == s || u == t || v == t) continue;
    int uu = vt(u);
    int vv = vt(v);
    if (ll[uu] != vv) {
      ll[uu] = vv;
      ans.push_back(make_pair(u, v));
    }
  }
  se.clear();
  for (int i = 1; i <= n; i++) {
    if (i != s && i != t) {
      int u = vt(i);
      ver[u].push_back(i);
      se.insert(u);
    }
  }
  int num = 0;
  memset(fst, -1, sizeof(fst));
  for (set<int>::iterator it = se.begin(); it != se.end(); it++) {
    int u = *it;
    int f1 = 0;
    int f2 = 0;
    for (int i = 0; i < ver[u].size(); i++) {
      int j = ver[u][i];
      for (int x = dau[j]; x != -1; x = edge[x].next) {
        int v = edge[x].v;
        if (v == s) f1 = 1;
        if (v == t) f2 = 1;
      }
    }
    if (f1 && f2) {
      num++;
      fst[u] = 0;
      continue;
    }
    if (f1) fst[u] = 1;
    if (f2) fst[u] = 2;
  }
  for (int i = dau[s]; i != -1; i = edge[i].next) {
    int v = edge[i].v;
    vt(v);
    if (v == t) continue;
    if (fst[ll[v]] == 1) {
      ds--;
      ans.push_back(make_pair(s, v));
      fst[ll[v]] = -1;
    }
  }
  for (int i = dau[t]; i != -1; i = edge[i].next) {
    int v = edge[i].v;
    vt(v);
    if (v == s) continue;
    if (fst[ll[v]] == 2) {
      dt--;
      ans.push_back(make_pair(t, v));
      fst[ll[v]] = -1;
    }
  }
  if (ds < 0 || dt < 0)
    cout << "No\n";
  else {
    if (num) {
      if (ds >= 1 && dt >= 1 && ds + dt - 2 >= num - 1) {
        int fl = 0;
        for (int i = dau[s]; i != -1; i = edge[i].next) {
          int v = edge[i].v;
          if (v == t) continue;
          if (fst[ll[v]] == 0 && ds) {
            if (!fl) fl = ll[v];
            ans.push_back(make_pair(s, v));
            fst[ll[v]] = -1;
            ds--;
          }
        }
        for (int i = dau[t]; i != -1; i = edge[i].next) {
          int v = edge[i].v;
          if (v == s) continue;
          if (ll[v] == fl) {
            dt--;
            ans.push_back(make_pair(t, v));
            fl = -1;
          }
          if (fst[ll[v]] == 0) {
            dt--;
            ans.push_back(make_pair(t, v));
            fst[ll[v]] = -1;
          }
        }
        cout << "Yes\n";
        for (int i = 0; i < ans.size(); i++)
          cout << ans[i].first << ' ' << ans[i].second << '\n';
      } else
        cout << "No\n";
    } else {
      if (kt && ds >= 1 && dt >= 1) {
        cout << "Yes\n";
        ans.push_back(make_pair(s, t));
        for (int i = 0; i < ans.size(); i++)
          cout << ans[i].first << ' ' << ans[i].second << '\n';
      } else
        cout << "No\n";
    }
  }
  return 0;
}
