#include <bits/stdc++.h>
using namespace std;
const int inf = 2e9;
struct edge {
  int a, b;
};
int main() {
  vector<bool> used, a1, b1;
  vector<int> uv, vv, z;
  int n, m, h, t, x, y, j, k, i, u, v;
  cin >> n >> m >> h >> t;
  vector<vector<int> > g(n);
  vector<edge> e;
  edge v1;
  for (i = 0; i < m; i++) {
    cin >> x >> y;
    x--;
    y--;
    v1.a = x;
    v1.b = y;
    e.push_back(v1);
    swap(v1.a, v1.b);
    e.push_back(v1);
    g[x].push_back(y);
    g[y].push_back(x);
  }
  for (i = 0; i < e.size(); i++) {
    u = e[i].a;
    v = e[i].b;
    if (g[u].size() >= h + 1 && g[v].size() >= t + 1) {
      used.clear();
      used.resize(n, false);
      used[v] = true;
      used[u] = true;
      vv.clear();
      uv.clear();
      a1.clear();
      b1.clear();
      a1.resize(n, false);
      b1.resize(n, false);
      for (j = 0; j < g[u].size(); j++) {
        int to = g[u][j];
        if (to == u) {
          continue;
        }
        a1[to] = true;
      }
      for (j = 0; j < g[v].size(); j++) {
        int to = g[v][j];
        if (to == v) {
          continue;
        }
        b1[to] = true;
      }
      for (j = 0; j < g[u].size(); j++) {
        int to = g[u][j];
        if (a1[to] && b1[to]) {
          continue;
        }
        if (!used[to]) {
          uv.push_back(to);
          used[to] = true;
          if (uv.size() == h) {
            break;
          }
        }
      }
      for (j = 0; j < g[v].size(); j++) {
        int to = g[v][j];
        if (a1[to] && b1[to]) {
          continue;
        }
        if (!used[to]) {
          vv.push_back(to);
          used[to] = true;
          if (vv.size() == t) {
            break;
          }
        }
      }
      for (j = 0; j < g[u].size(); j++) {
        int to = g[u][j];
        if (uv.size() == h) {
          break;
        }
        if (!used[to]) {
          uv.push_back(to);
          used[to] = true;
        }
      }
      for (j = 0; j < g[v].size(); j++) {
        int to = g[v][j];
        if (vv.size() == t) {
          break;
        }
        if (!used[to]) {
          vv.push_back(to);
          used[to] = true;
        }
      }
      if (uv.size() == h && vv.size() == t) {
        cout << "YES" << endl << u + 1 << " " << v + 1 << endl;
        for (j = 0; j < uv.size(); j++) {
          cout << uv[j] + 1 << " ";
        }
        cout << endl;
        for (j = 0; j < vv.size(); j++) {
          cout << vv[j] + 1 << " ";
        }
        return 0;
      }
    }
  }
  cout << "NO";
  return 0;
}
