#include <bits/stdc++.h>   struct node {     int v;     node *next;   } edge[400000 * 2 + 10], *adj[200000 + 10], *ecnt = &edge[0];   struct Edge {     int u, v;     Edge() {}     Edge(int u, int v) : u(u), v(v) {}   } e[400000 + 10], ans[400000 + 10];   int n, m, s, t, ds, dt, col[200000 + 10], cntcol, cnta, fa[200000 + 10],       belong[200000 + 10];   int able[2][200000 + 10], link[2][200000 + 10];   template <class T>   void Read(T &x) {     char c;     while (c = getchar(), c != EOF)       if (c >=  0  && c <=  9 ) {         x = c -  0 ;         while (c = getchar(), c >=  0  && c <=  9 ) x = x * 10 + c -  0 ;         ungetc(c, stdin);         return;       }   }   void read() {     Read(n), Read(m);     for (int i = 1; i <= m; i++) Read(e[i].u), Read(e[i].v);     Read(s), Read(t), Read(ds), Read(dt);   }   void addedge(int u, int v) {     node *p = ++ecnt;     p->v = v;     p->next = adj[u];     adj[u] = p;   }   void dfs(int u) {     col[u] = cntcol;     for (node *p = adj[u]; p; p = p->next)       if (!col[p->v]) dfs(p->v);   }   int Find(int x) { return x == fa[x] ? x : fa[x] = Find(fa[x]); }   void solve() {     for (int i = 1; i <= n; i++) fa[i] = i;     for (int i = 1; i <= m; i++) {       if (e[i].u == s || e[i].u == t || e[i].v == s || e[i].v == t) continue;       if (Find(e[i].u) != Find(e[i].v)) {         fa[Find(e[i].u)] = Find(e[i].v);         ans[++cnta] = e[i];         addedge(e[i].u, e[i].v), addedge(e[i].v, e[i].u);       }     }     for (int i = 1; i <= n; i++)       if (!col[i]) {         ++cntcol;         dfs(i);       }     for (int i = 1; i <= m; i++)       if (e[i].u == s || e[i].u == t || e[i].v == s || e[i].v == t)         addedge(e[i].u, e[i].v), addedge(e[i].v, e[i].u);     int cnts = 0, cntt = 0;     belong[col[s]]++;     for (node *p = adj[s]; p; p = p->next)       if (!belong[col[p->v]]) belong[col[p->v]]++;     belong[col[t]]++;     for (node *p = adj[t]; p; p = p->next)       if (!belong[col[p->v]]) {         ans[++cnta] = Edge(t, p->v), cntt++;         belong[col[p->v]] = -1;       } else if (belong[col[p->v]] == 1) {         belong[col[p->v]]++;         able[1][col[p->v]] = p->v;       }     for (node *p = adj[s]; p; p = p->next)       if (belong[col[p->v]] == 1) {         ans[++cnta] = Edge(s, p->v), cnts++;         belong[col[p->v]] = -1;       } else if (belong[col[p->v]] == 2)         able[0][col[p->v]] = p->v;     if (cnts > ds || cntt > dt)       puts( No );     else {       ds -= cnts, dt -= cntt;       bool f = false;       for (node *p = adj[s]; p; p = p->next)         if (belong[col[p->v]] == 2 && ds && p->v != t) {           ds--;           ans[++cnta] = Edge(s, p->v);           link[0][col[p->v]] = p->v;           belong[col[p->v]] = 0;         }       if (ds && dt && belong[col[t]] == 2) {         f = true;         ans[++cnta] = Edge(s, t);         belong[col[s]] = 0;         dt--;       }       for (node *p = adj[t]; p; p = p->next)         if (belong[col[p->v]] == 2 && p->v != s) {           if (!dt) {             puts( No );             return;           }           dt--;           ans[++cnta] = Edge(t, p->v);           link[1][col[p->v]] = p->v;           belong[col[p->v]] = 0;         }       if (!f && dt && ds && belong[col[s]] == 2) {         f = true;         ans[++cnta] = Edge(s, t);         ds--;       }       if (!f && (ds || dt)) {         if (ds) {           for (int i = 1; i <= cntcol; i++)             if (able[0][i] && link[1][i]) {               f = true;               ans[++cnta] = Edge(s, able[0][i]);               break;             }         }         if (!f && dt) {           for (int i = 1; i <= cntcol; i++)             if (able[1][i] && link[0][i]) {               f = true;               ans[++cnta] = Edge(t, able[1][i]);               break;             }         }       }       if (f) {         puts( Yes );         for (int i = 1; i <= cnta; i++) printf( %d %d n , ans[i].u, ans[i].v);       } else         puts( No );     }   }   int main() {     read();     solve();     return 0;   }