#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;   }