#include <bits/stdc++.h>
using namespace std;
inline int read(void) {
  int x = 0, tmp = 1;
  char c = getchar();
  while ((c < '0' || c > '9') && c != '-') c = getchar();
  if (c == '-') tmp = -1, c = getchar();
  while (c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();
  return x * tmp;
}
const int N = 100010;
int n, m, h, t;
bool flag;
vector<int> g[N];
pair<int, int> edge[N];
vector<int>::iterator it;
bool Solve(void) {
  for (int j = 1; j <= m; ++j) {
    int x = edge[j].first, y = edge[j].second;
    int cntx = (int)g[x].size() - 1;
    int cnty = (int)g[y].size() - 1;
    if (cntx < h || cnty < t) continue;
    vector<int> ansx, ansy;
    if (cntx >= h + t || cnty >= h + t) {
      puts("YES");
      bool vis[N];
      if (cnty >= h + t) {
        for (it = g[x].begin(); it != g[x].end(); ++it) {
          int u = *it;
          if (u == y || vis[u]) continue;
          ansx.push_back(u);
          vis[u] = 1;
          if ((int)ansx.size() == h) break;
        }
        for (it = g[y].begin(); it != g[y].end(); ++it) {
          int u = *it;
          if (u == x || vis[u]) continue;
          ansy.push_back(u);
          vis[u] = 1;
          if ((int)ansy.size() == t) break;
        }
      } else {
        for (it = g[y].begin(); it != g[y].end(); ++it) {
          int u = *it;
          if (u == x || vis[u]) continue;
          ansy.push_back(u);
          vis[u] = 1;
          if ((int)ansy.size() == t) break;
        }
        for (it = g[x].begin(); it != g[x].end(); ++it) {
          int u = *it;
          if (u == y || vis[u]) continue;
          ansx.push_back(u);
          vis[u] = 1;
          if ((int)ansx.size() == h) break;
        }
      }
      if (!flag) {
        printf("%d %d\n", x, y);
      } else {
        printf("%d %d\n", y, x);
        swap(ansx, ansy);
      }
      for (it = ansx.begin(); it != ansx.end(); ++it) printf("%d ", *it);
      putchar('\n');
      for (it = ansy.begin(); it != ansy.end(); ++it) printf("%d ", *it);
      putchar('\n');
      return 1;
    }
    vector<int> a;
    int b[N];
    fill(b + 1, b + 1 + n, 0);
    for (it = g[x].begin(); it != g[x].end(); ++it) {
      int u = *it;
      if (u != y) b[u] = 1;
    }
    int cnt = 0;
    for (it = g[y].begin(); it != g[y].end(); ++it) {
      int u = *it;
      if (u == x) continue;
      if (b[u] == 1) ++cnt, a.push_back(u), b[u] = 2;
    }
    int delta = cntx - h + cnty - t;
    if (delta < cnt) continue;
    puts("YES");
    for (it = g[x].begin(); it != g[x].end(); ++it) {
      int u = *it;
      if (u == y || b[u] == 2) continue;
      ansx.push_back(u);
      if ((int)ansx.size() == h) break;
    }
    for (it = g[y].begin(); it != g[y].end(); ++it) {
      int u = *it;
      if (u == x || b[u] == 2) continue;
      ansy.push_back(u);
      if ((int)ansy.size() == t) break;
    }
    int p = (int)ansx.size();
    while (p < h) {
      ansx.push_back(a.back());
      a.pop_back();
      ++p;
    }
    p = (int)ansy.size();
    while (p < t) {
      ansy.push_back(a.back());
      a.pop_back();
      ++p;
    }
    if (!flag) {
      printf("%d %d\n", x, y);
    } else {
      printf("%d %d\n", y, x);
      swap(ansx, ansy);
    }
    for (it = ansx.begin(); it != ansx.end(); ++it) printf("%d ", *it);
    putchar('\n');
    for (it = ansy.begin(); it != ansy.end(); ++it) printf("%d ", *it);
    putchar('\n');
    return 1;
  }
  return 0;
}
int main(void) {
  n = read(), m = read();
  h = read(), t = read();
  flag = 0;
  if (h > t) swap(h, t), flag = 1;
  for (int i = 1; i <= m; ++i) {
    int x = read(), y = read();
    edge[i] = make_pair(x, y);
    g[x].push_back(y);
    g[y].push_back(x);
  }
  for (int i = 1; i <= m; ++i) {
    int x = edge[i].first, y = edge[i].second;
    if ((int)g[x].size() > (int)g[y].size())
      swap(edge[i].first, edge[i].second);
  }
  bool qwq = 0;
  for (int i = 1; i <= n; ++i)
    if ((int)g[i].size() - 1 >= t) {
      qwq = 1;
      break;
    }
  if (!qwq) {
    puts("NO");
    return 0;
  }
  if (!Solve()) puts("NO");
  return 0;
}
