#include <bits/stdc++.h>
using namespace std;
const int N = 100500;
const int M = 300;
vector<int> g[N];
bool us[N];
bool ans_found = false;
int *head = new int[M];
int *tail = new int[M];
int common[M];
int body, chest;
int hz, tz, cz;
int need_head, need_tail;
int merge(int &v1, int &v2) {
  int i = 0;
  int j = 0;
  hz = 0;
  tz = 0;
  cz = 0;
  for (; i < g[v1].size() && j < g[v2].size();) {
    int &a = g[v1][i];
    int &b = g[v2][j];
    if (a == b) {
      if (cz < M) common[cz++] = a;
      i++;
      j++;
    } else if (a < b) {
      if (a != v1 && a != v2 && hz < M) head[hz++] = a;
      i++;
    } else {
      if (b != v1 && b != v2 && tz < M) tail[tz++] = b;
      j++;
    }
  }
  for (; i < g[v1].size(); i++) {
    int &a = g[v1][i];
    if (a != v1 && a != v2 && hz < M) head[hz++] = a;
  }
  for (; j < g[v2].size(); j++) {
    int &b = g[v2][j];
    if (b != v1 && b != v2 && tz < M) tail[tz++] = b;
  }
}
void check(int v, int to) {
  body = v;
  chest = to;
  if (hz >= need_head && tz >= need_tail) {
    ans_found = true;
  } else {
    int nh = max(0, need_head - hz);
    int nt = max(0, need_tail - tz);
    int need_more = nh + nt;
    if (cz >= need_more) {
      ans_found = true;
      for (int i = 0; i < nh; i++) {
        head[hz++] = common[i];
      }
      for (int i = nh; i < need_more; i++) {
        tail[tz++] = common[i];
      }
    }
  }
}
void dfs(int v) {
  if (us[v] || ans_found) return;
  us[v] = true;
  for (int i = 0; i < g[v].size(); i++) {
    if (ans_found) {
      break;
    }
    int to = g[v][i];
    bool can = false;
    if (g[v].size() > need_head && g[to].size() > need_tail ||
        g[v].size() > need_tail && g[to].size() > need_head) {
      merge(v, to);
      can = true;
    }
    if (can) check(v, to);
    if (!ans_found && can) {
      swap(head, tail);
      swap(hz, tz);
      check(to, v);
    }
    dfs(to);
  }
}
bool solve() {
  int n, m;
  if (!(cin >> n >> m >> need_head >> need_tail)) return false;
  for (int i = 0; i < n; i++) {
    g[i].clear();
    us[i] = false;
  }
  for (int i = 0; i < m; i++) {
    int a, b;
    scanf("%d%d", &a, &b);
    a--;
    b--;
    g[a].push_back(b);
    g[b].push_back(a);
  }
  for (int i = 0; i < n; i++) {
    sort(g[i].begin(), g[i].end());
  }
  ans_found = false;
  for (int i = 0; i < n; i++) dfs(i);
  if (ans_found) {
    puts("YES");
    printf("%d %d\n", body + 1, chest + 1);
    for (int i = 0; i < need_head; i++) {
      printf("%d ", head[i] + 1);
    }
    printf("\n");
    for (int i = 0; i < need_tail; i++) {
      printf("%d ", tail[i] + 1);
    }
    printf("\n");
  } else {
    puts("NO");
  }
  return true;
}
int main() {
  while (solve())
    ;
  return 0;
}
