/**
 * Author: Sergey Kopeliovich (Burunduk30@gmail.com)
 */

#include <bits/stdc++.h>

using namespace std;

#define forn(i, n) for (int i = 0; i < (int)(n); i++)

const int N = 2000;

int n, m, u[N], xn, L, R, e, value[N];
vector<int> c[N], x[N];
int f[N + 1][N + 1];

void relax( int &a, int b ) { a = max(a, b); }

void dfs( int v ) {
  u[v] = 1, x[xn].push_back(v);
  e += c[v].size();
  for (int x : c[v])
	  if (!u[x])
		  dfs(x);
}

int main() {
  #define NAME "team"
  assert(freopen(NAME ".in", "r", stdin));
  assert(freopen(NAME ".out", "w", stdout));
  scanf("%d%d%d%d", &n, &m, &L, &R);
  while (m--) {
	  int a, b;
	  scanf("%d%d", &a, &b), a--, b--;
	  c[a].push_back(b), c[b].push_back(a);
	}
  forn(i, n) 
	  if (!u[i]) {
		  e = 0;
		  dfs(i);
		  value[xn++] = e;
		}
  f[0][0] = 1;
  forn(i, xn) {
	  copy(f[i], f[i] + n + 1, f[i + 1]);
	  forn(w, n + 1)
		  if (f[i][w])
			  relax(f[i + 1][w + x[i].size()], f[i][w] + value[i]);
	}
  int ri = L;
  for (int i = L; i <= R; i++)
	  if (f[xn][i] > f[xn][ri])
		  ri = i;
  if (!f[xn][ri]) {
	  puts("-1");
	  return 0;
	}
  printf("%d\n", ri);
  while (xn--)
	  if (f[xn + 1][ri] != f[xn][ri]) 
		  for (int y : x[xn])
			  printf("%d ", y + 1), ri--;
  return 0;
}