#include <bits/stdc++.h>
using namespace std;
const int INF = 1e9;
const double EPS = 1e-9;
int N;
vector<int> G[100500];
pair<int, int> E[100500];
int v[3][100500];
int cnt[3];
int pos = 0;
void print(int nm, int c) {
  int p = 0;
  for (int i = 0; i < cnt[nm] && i < c; ++i) {
    printf("%d ", v[nm][i] + 1);
    ++p;
  }
  for (int i = p; i < c; ++i) {
    printf("%d ", v[2][pos] + 1);
    ++pos;
  }
  puts("");
}
bool solve(int x, int y, int h, int t, bool rev) {
  int nm = max(0, h - cnt[0]) + max(0, t - cnt[1]);
  if (cnt[2] < nm) return false;
  puts("YES");
  if (!rev) {
    printf("%d %d\n", x + 1, y + 1);
    print(0, h);
    print(1, t);
  } else {
    printf("%d %d\n", y + 1, x + 1);
    print(1, t);
    print(0, h);
  }
  return true;
}
int h, t;
bool find(int x, int y) {
  int a = G[x].size() - 1;
  int b = G[y].size() - 1;
  if ((a < h || b < t) && (a < t || b < h)) return false;
  cnt[0] = cnt[1] = cnt[2] = 0;
  int i = 0;
  int j = 0;
  while (i < G[x].size() && j < G[y].size()) {
    if (G[x][i] == G[y][j]) {
      if (G[x][i] != y) {
        v[2][cnt[2]] = G[x][i];
        ++cnt[2];
      }
      ++i;
      ++j;
      continue;
    }
    if (G[x][i] < G[y][j]) {
      if (G[x][i] != y) {
        v[0][cnt[0]] = G[x][i];
        ++cnt[0];
      }
      ++i;
      continue;
    }
    if (G[x][i] > G[y][j]) {
      if (G[y][j] != x) {
        v[1][cnt[1]] = G[y][j];
        ++cnt[1];
      }
      ++j;
      continue;
    }
  }
  while (i < G[x].size()) {
    if (G[x][i] != y) {
      v[0][cnt[0]] = G[x][i];
      ++cnt[0];
    }
    ++i;
  }
  while (j < G[y].size()) {
    if (G[y][j] != x) {
      v[1][cnt[1]] = G[y][j];
      ++cnt[1];
    }
    ++j;
  }
  if (solve(x, y, h, t, false)) return true;
  if (solve(x, y, t, h, true)) return true;
  return false;
}
int main() {
  int M;
  scanf("%d%d", &N, &M);
  scanf("%d%d", &h, &t);
  for (int i = 0; i < M; ++i) {
    int a, b;
    scanf("%d%d", &a, &b);
    --a;
    --b;
    E[i] = pair<int, int>(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());
  }
  for (int i = 0; i < M; ++i) {
    if (find(E[i].first, E[i].second)) return 0;
  }
  puts("NO");
  return 0;
}
