#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 5;
int a, b;
int n, m, h, t;
int d[maxn];
vector<int> g[maxn];
vector<int> ans[maxn];
struct Edge {
  int u, v;
} eg[maxn];
bool cmp(const Edge& a, const Edge& b) { return min(a.u, a.v) > min(b.u, b.v); }
int main() {
  scanf("%d%d%d%d", &n, &m, &h, &t);
  for (int i = 0; i < m; ++i) {
    scanf("%d%d", &eg[i].u, &eg[i].v);
    int p = eg[i].u, q = eg[i].v;
    g[p].push_back(q);
    g[q].push_back(p);
    d[p]++;
    d[q]++;
  }
  sort(eg, eg + m, cmp);
  for (int i = 1; i <= n; ++i) sort(g[i].begin(), g[i].end());
  bool flag = false;
  int anu, anv;
  for (int i = 0; i < m; ++i) {
    set<int> s;
    int u = eg[i].u, v = eg[i].v;
    if (d[u] >= h + 1 && d[v] >= t + 1 || d[u] >= t + 1 && d[v] >= h + 1) {
      int c1 = 0, c2 = 0;
      for (int j = 0; j < g[u].size(); ++j) {
        int e = g[u][j];
        if (e == v) continue;
        if (!binary_search(g[v].begin(), g[v].end(), e)) {
          c1++;
          ans[u].push_back(e);
        } else
          s.insert(e);
      }
      for (int j = 0; j < g[v].size(); ++j) {
        int e = g[v][j];
        if (e == u) continue;
        if (s.count(e) == 0) {
          c2++;
          ans[v].push_back(e);
        }
      }
      if (c1 >= t && c2 >= h) {
        flag = true;
        anu = v, anv = u;
        break;
      }
      if (c1 >= h && c2 >= t) {
        anu = u, anv = v;
        flag = true;
        break;
      }
      int p = max(0, max(h, t) - max(c1, c2)),
          q = max(0, min(h, t) - min(c1, c2));
      int need = p + q;
      if (s.size() >= need) {
        set<int>::iterator it;
        int k = 0;
        if (c1 > c2) {
          for (it = s.begin(), k = 0; k < p; k++, it++) {
            ans[u].push_back(*it);
          }
          for (k = 0; k < q; k++, it++) {
            ans[v].push_back(*it);
          }
        } else {
          for (it = s.begin(), k = 0; k < q; k++, it++) {
            ans[u].push_back(*it);
          }
          for (k = 0; k < p; k++, it++) {
            ans[v].push_back(*it);
          }
        }
        if (ans[u].size() >= h && ans[v].size() >= t)
          anu = u, anv = v;
        else if (ans[u].size() >= t && ans[v].size() >= h)
          anu = v, anv = u;
        flag = true;
        break;
      }
      ans[u].clear();
      ans[v].clear();
    }
  }
  if (flag) {
    printf("YES\n");
    printf("%d %d\n", anu, anv);
    for (int i = 0; i < h; ++i) printf("%d ", ans[anu][i]);
    printf("\n");
    for (int i = 0; i < t; ++i) printf("%d ", ans[anv][i]);
  } else
    printf("NO\n");
}
