#include <bits/stdc++.h>
using namespace std;
int cnt, h[2000005], sign, d[2000005], l[2000005], sta[2000005], be[2000005], n,
    P, M, m, top, occ, ans;
struct l1 {
  int to, next;
} p[4000005];
void add(int x, int y) {
  cnt++;
  p[cnt].to = y;
  p[cnt].next = h[x];
  h[x] = cnt;
}
void tarjan(int x) {
  d[x] = l[x] = ++sign;
  sta[++top] = x;
  for (int i = h[x]; i; i = p[i].next) {
    int y = p[i].to;
    if (!d[y]) {
      tarjan(y);
      l[x] = min(l[x], l[y]);
    } else if (!be[y]) {
      l[x] = min(l[x], d[y]);
    }
  }
  if (d[x] == l[x]) {
    occ++;
    while (sta[top + 1] != x) {
      be[sta[top]] = occ;
      top--;
    }
  }
}
void Fail() {
  printf("-1");
  exit(0);
}
int main() {
  scanf("%d%d%d%d", &n, &P, &M, &m);
  for (int i = 1; i <= n; i++) {
    int x, y;
    scanf("%d%d", &x, &y);
    add(x + P, y);
    add(y + P, x);
  }
  for (int i = 1; i <= P; i++) {
    int l, r;
    scanf("%d%d", &l, &r);
    if (l != 1) add(2 * P + l - 1, i + P), add(i, 2 * P + M + l - 1);
    add(2 * P + M + r, i + P);
    add(i, 2 * P + r);
  }
  for (int i = 1; i <= m; i++) {
    int x, y;
    scanf("%d%d", &x, &y);
    add(x, y + P);
    add(y, x + P);
  }
  for (int i = 1; i < M; i++) {
    add(2 * P + i, 2 * P + i + 1);
    add(2 * P + M + i + 1, 2 * P + M + i);
  }
  add(2 * P + 2 * M, 2 * P + M);
  for (int i = 1; i <= 2 * (P + M); i++) {
    if (!d[i]) tarjan(i);
  }
  for (int i = 1; i <= P; i++) {
    if (be[i] == be[i + P]) Fail();
    if (be[i] < be[i + P]) sta[++top] = i;
  }
  for (int i = 1; i <= M; i++) {
    if (be[2 * P + i] == be[2 * P + i + M]) Fail();
    if (be[2 * P + i] < be[2 * P + i + M]) {
      ans = i;
      break;
    }
  }
  printf("%d %d\n", top, ans);
  for (int i = 1; i <= top; i++) printf("%d ", sta[i]);
}
