#include <bits/stdc++.h>
using namespace std;
const int S = 123456;
int n, m, h, t, head, tail;
vector<int> graph[S], hu, tv, common;
bool dfs(int u, int siz) {
  if (siz >= h + 1) {
    for (auto v : graph[u]) {
      if (graph[v].size() >= t + 1) {
        hu.clear(), tv.clear(), common.clear();
        bool visit[S];
        memset(visit, false, sizeof(visit));
        for (auto i : graph[v]) {
          visit[i] = true;
        }
        for (auto i : graph[u]) {
          if (visit[i] && i != u && i != v)
            common.push_back(i), visit[i] = false;
          else
            visit[i] = true;
        }
        int tSiz = 0, hSiz = 0, cSiz = common.size();
        for (auto i : graph[v]) {
          if (visit[i])
            if (i != u) tv.push_back(i), tSiz++;
        }
        for (auto i : graph[u]) {
          if (visit[i])
            if (i != v) hu.push_back(i), hSiz++;
        }
        while (hSiz < h && cSiz > 0)
          hu.push_back(common[cSiz - 1]), cSiz--, hSiz++;
        while (tSiz < t && cSiz > 0)
          tv.push_back(common[cSiz - 1]), cSiz--, tSiz++;
        if (hSiz >= h && tSiz >= t) {
          head = u;
          tail = v;
          return true;
        }
      }
    }
    return false;
  } else {
    for (auto v : graph[u]) {
      if (graph[v].size() >= h + 1) {
        hu.clear(), tv.clear(), common.clear();
        bool visit[S];
        memset(visit, false, sizeof(visit));
        for (auto i : graph[v]) {
          visit[i] = true;
        }
        for (auto i : graph[u]) {
          if (visit[i] && i != u && i != v)
            common.push_back(i), visit[i] = false;
          else
            visit[i] = true;
        }
        int tSiz = 0, hSiz = 0, cSiz = common.size();
        ;
        for (auto i : graph[v]) {
          if (visit[i])
            if (i != u) hu.push_back(i), hSiz++;
        }
        for (auto i : graph[u]) {
          if (visit[i])
            if (i != v) tv.push_back(i), tSiz++;
        }
        while (hSiz < h && cSiz > 0)
          hu.push_back(common[cSiz - 1]), cSiz--, hSiz++;
        while (tSiz < t && cSiz > 0)
          tv.push_back(common[cSiz - 1]), cSiz--, tSiz++;
        if (hSiz >= h && tSiz >= t) {
          head = v;
          tail = u;
          return true;
        }
      }
    }
    return false;
  }
}
int main() {
  while (scanf("%d %d %d %d", &n, &m, &h, &t) == 4) {
    for (int i = 0; i < m; i++) {
      int u, v;
      scanf("%d %d", &u, &v);
      graph[u].push_back(v);
      graph[v].push_back(u);
    }
    bool flag = true;
    for (int i = 1; i <= n; i++) {
      int siz = graph[i].size();
      if (siz >= h + 1 || siz >= t + 1) {
        if (dfs(i, siz)) {
          flag = false;
          puts("YES");
          printf("%d %d\n", head, tail);
          for (int j = 0; j < h; j++) printf("%d ", hu[j]);
          printf("\n");
          for (int j = 0; j < t; j++) printf("%d ", tv[j]);
          printf("\n");
          break;
        }
      }
    }
    if (flag) puts("NO");
    for (int i = 1; i <= n; i++) graph[i].clear();
  }
  return 0;
}
