#include <bits/stdc++.h>
using namespace std;
struct Graph {
  int id, next;
} g[101000 * 2];
struct Edge {
  int x, y;
} e[101000 * 2];
int st[101000], n, m, H, T, d[101000], CC[2][101000];
int vis[101000];
void Add(int tot, int x, int y) {
  g[tot].id = y, g[tot].next = st[x], st[x] = tot;
}
void init() {
  scanf("%d%d%d%d", &n, &m, &H, &T);
  memset(st, -1, sizeof(st));
  for (int i = 1; i <= m; i++) {
    scanf("%d%d", &e[i].x, &e[i].y);
    Add(i * 2, e[i].x, e[i].y), Add(i * 2 + 1, e[i].y, e[i].x);
    d[e[i].x]++, d[e[i].y]++;
    e[i + m].x = e[i].y, e[i + m].y = e[i].x;
  }
}
void Sel(int x, int num, bool f1, int id) {
  for (int i = st[x]; i != -1; i = g[i].next)
    if (vis[g[i].id] != -101000) {
      vis[g[i].id] = -101000;
      CC[id][++CC[id][0]] = g[i].id;
      if (CC[id][0] == num) break;
    }
}
void solve() {
  for (int i = 1; i <= m * 2; i++) {
    int x = e[i].x, y = e[i].y, h = d[x] - 1, t = d[y] - 1;
    if (h < H || t < T) continue;
    if (h >= H + T) {
      vis[x] = vis[y] = -101000;
      printf("YES\n%d %d\n", x, y), Sel(y, T, 0, 1), Sel(x, H, 1, 0);
      return;
    }
    if (t >= H + T) {
      vis[x] = vis[y] = -101000;
      printf("YES\n%d %d\n", x, y), Sel(x, H, 0, 0), Sel(y, T, 1, 1);
      return;
    }
    for (int j = st[x]; j != -1; j = g[j].next)
      if (g[j].id != y) vis[g[j].id] = i;
    int num = 0;
    for (int j = st[y]; j != -1; j = g[j].next)
      if (g[j].id != x && vis[g[j].id] == i) num++, vis[g[j].id] = -i;
    if (h + t - num < H + T) continue;
    CC[0][0] = CC[1][0] = 0;
    for (int j = st[x]; j != -1; j = g[j].next)
      if (vis[g[j].id] == i && CC[0][0] < H) CC[0][++CC[0][0]] = g[j].id;
    for (int j = st[x]; j != -1; j = g[j].next)
      if (vis[g[j].id] == -i && CC[0][0] < H)
        CC[0][++CC[0][0]] = g[j].id, vis[g[j].id] = i;
    for (int j = st[y]; j != -1; j = g[j].next)
      if (vis[g[j].id] != i && g[j].id != x && CC[1][0] < T)
        CC[1][++CC[1][0]] = g[j].id;
    if (CC[0][0] < H || CC[1][0] < T) continue;
    printf("YES\n%d %d\n", x, y);
    return;
  }
  puts("NO"), exit(0);
}
void print() {
  for (int i = 0; i <= 1; i++, puts(""))
    for (int j = 1; j <= CC[i][0]; j++) printf("%d ", CC[i][j]);
}
int main() {
  init();
  solve();
  print();
  return 0;
}
