#include <bits/stdc++.h>
using namespace std;
int id[200005], sz[200005];
vector<pair<int, int> > edges;
int n, m, s1, s2, l1, l2;
bool bad(int x) { return x == s1 || x == s2; }
bool cmp(pair<int, int> p1, pair<int, int> p2) {
  bool b1 = bad(p1.first) || bad(p1.second);
  bool b2 = bad(p2.first) || bad(p2.second);
  if (b1 ^ b2) return b1 ? false : true;
  return p1 < p2;
}
int root(int x) {
  if (x == id[x]) return x;
  return id[x] = root(id[x]);
}
vector<pair<int, int> > ans;
bool merge(int x, int y) {
  int xx = x, yy = y;
  x = root(x);
  y = root(y);
  if (x == y) return false;
  if (sz[x] < sz[y]) swap(x, y);
  id[y] = x;
  sz[x] += sz[y];
  ans.push_back(make_pair(xx, yy));
  return true;
}
int ok1[200005], ok2[200005];
int main() {
  ios::sync_with_stdio(false);
  scanf("%d%d", &n, &m);
  for (int i = 0; i < n; i++) id[i] = i, sz[i] = 1, ok1[i] = ok2[i] = -1;
  for (int i = 0; i < m; i++) {
    int u, v;
    scanf("%d%d", &u, &v);
    edges.push_back(make_pair(u - 1, v - 1));
  }
  scanf("%d%d%d%d", &s1, &s2, &l1, &l2);
  --s1;
  --s2;
  sort(edges.begin(), edges.end(), cmp);
  int ind = 0;
  while (ind < int(edges.size()))
    if (bad(edges[ind].first) || bad(edges[ind].second))
      break;
    else
      merge(edges[ind].first, edges[ind].second), ind++;
  for (int i = ind; i < int(edges.size()); i++) {
    if (edges[i].first == s1) ok1[root(edges[i].second)] = edges[i].second;
    if (edges[i].second == s1) ok1[root(edges[i].first)] = edges[i].first;
    if (edges[i].first == s2) ok2[root(edges[i].second)] = edges[i].second;
    ;
    if (edges[i].second == s2) ok2[root(edges[i].first)] = edges[i].first;
  }
  int a = 0, b = 0, c = 0;
  for (int i = 0; i < n; i++)
    if (root(i) == i && i != s1 && i != s2) {
      if (ok1[i] != -1 && ok2[i] != -1)
        c++;
      else if (ok1[i] != -1)
        a++;
      else if (ok2[i] != -1)
        b++;
      else {
        puts("No");
        return 0;
      }
    }
  if (a >= l1 || b >= l2) {
    puts("No");
    return 0;
  }
  l1 -= a;
  l2 -= b;
  if (c + 1 > l1 + l2) {
    puts("No");
    return 0;
  }
  for (int i = 0; i < n; i++)
    if (root(i) == i && i != s1 && i != s2) {
      if (ok1[i] != -1 && ok2[i] != -1)
        continue;
      else if (ok1[i] != -1)
        merge(s1, ok1[i]);
      else if (ok2[i] != -1)
        merge(s2, ok2[i]);
      else {
        puts("No");
        return 0;
      }
    }
  int lst = -1;
  for (int i = 0; i < n; i++)
    if (root(i) == i && i != s1 && i != s2) {
      if (ok1[i] != -1 && ok2[i] != -1) {
        if (l1 > 1)
          merge(s1, ok1[i]), l1--, lst = 1;
        else
          merge(s2, ok2[i]), l2--, lst = 2;
      }
    }
  if (ok2[s1] != -1 && l1 >= 1 && l2 >= 1)
    merge(s1, s2);
  else if (lst == -1) {
    puts("No");
    return 0;
  } else {
    for (int i = n - 1; i >= 0; i--)
      if (ok1[i] != -1 && ok2[i] != -1) {
        if (lst == 2 && l1 > 0)
          merge(s1, ok1[i]), l1--;
        else if (lst == 1 && l2 > 0)
          merge(s2, ok2[i]), l2--;
        else {
          puts("No");
          return 0;
        }
        break;
      }
  }
  puts("Yes");
  for (int i = 0; i < int(ans.size()); i++)
    printf("%d %d\n", ans[i].first + 1, ans[i].second + 1);
  return 0;
}
