#include <bits/stdc++.h>
using namespace std;
void IO() {
  mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
}
int N;
long long int n, p, m, M;
vector<int> unlocked;
vector<vector<int>> g, gt;
vector<bool> visited;
vector<int> order, comp;
vector<bool> assignment;
void dfs1(int v) {
  visited[v] = true;
  for (int u : g[v]) {
    if (!visited[u]) dfs1(u);
  }
  order.push_back(v);
}
void dfs2(int v, int cl) {
  comp[v] = cl;
  for (int u : gt[v]) {
    if (comp[u] == -1) dfs2(u, cl);
  }
}
bool solve_2SAT() {
  visited.assign(N, false);
  for (int i = 0; i < N; ++i) {
    if (!visited[i]) dfs1(i);
  }
  comp.assign(N, -1);
  for (int i = 0, j = 0; i < N; ++i) {
    int v = order[N - i - 1];
    if (comp[v] == -1) dfs2(v, j++);
  }
  assignment.assign(N / 2, false);
  for (int i = 0; i < N / 2; i++) {
    if (comp[i] == comp[N / 2 + i]) return false;
    assignment[i] = comp[i] > comp[N / 2 + i];
  }
  return true;
}
int main() {
  IO();
  cin >> n >> p >> M >> m;
  N = 2 * p + 2 * M;
  long long int offset = N / 2;
  long long int x, y;
  g.resize(N);
  gt.resize(N);
  for (__typeof(n) i = (0) - ((0) > (n)); i != (n) - ((0) > (n));
       i += 1 - 2 * ((0) > (n))) {
    cin >> x >> y;
    x--;
    y--;
    g[x + offset].push_back(y);
    g[y + offset].push_back(x);
    gt[y].push_back(x + offset);
    gt[x].push_back(y + offset);
  }
  vector<pair<int, int>> ranges(p);
  for (__typeof(p) i = (0) - ((0) > (p)); i != (p) - ((0) > (p));
       i += 1 - 2 * ((0) > (p))) {
    cin >> ranges[i].first >> ranges[i].second;
  }
  for (__typeof(m) i = (0) - ((0) > (m)); i != (m) - ((0) > (m));
       i += 1 - 2 * ((0) > (m))) {
    cin >> x >> y;
    x--;
    y--;
    g[x].push_back(y + offset);
    g[y].push_back(x + offset);
    gt[x + offset].push_back(y);
    gt[y + offset].push_back(x);
  }
  g[offset + p].push_back(offset + p + 1);
  gt[offset + p + 1].push_back(offset + p);
  for (__typeof(M) i = (1) - ((1) > (M)); i != (M) - ((1) > (M));
       i += 1 - 2 * ((1) > (M))) {
    g[p + i].push_back(p + i - 1);
    gt[p + i - 1].push_back(p + i);
    if (i + 1 < M) {
      g[offset + p + i].push_back(offset + p + i + 1);
      gt[offset + p + i + 1].push_back(offset + p + i);
    }
  }
  for (__typeof(p) i = (0) - ((0) > (p)); i != (p) - ((0) > (p));
       i += 1 - 2 * ((0) > (p))) {
    int l = ranges[i].first, r = ranges[i].second;
    l--;
    r--;
    g[i].push_back(p + l);
    g[offset + p + l].push_back(offset + i);
    gt[p + l].push_back(i);
    gt[offset + i].push_back(offset + p + l);
    if (r + 1 < M) {
      g[p + (r + 1)].push_back(offset + i);
      g[i].push_back(offset + p + (r + 1));
      gt[offset + i].push_back(p + (r + 1));
      gt[offset + p + (r + 1)].push_back(i);
    }
  }
  if (solve_2SAT()) {
    long long int f = -1;
    for (long long int i = p + M - 1; i >= p; i--) {
      if (assignment[i]) {
        f = i + 1 - p;
        break;
      }
    }
    long long int cnt = 0;
    for (__typeof(p) i = (0) - ((0) > (p)); i != (p) - ((0) > (p));
         i += 1 - 2 * ((0) > (p))) {
      if (assignment[i]) cnt++;
    }
    cout << cnt << " " << f << "\n";
    for (__typeof(p) i = (0) - ((0) > (p)); i != (p) - ((0) > (p));
         i += 1 - 2 * ((0) > (p))) {
      if (assignment[i]) cout << i + 1 << " ";
    }
  } else {
    cout << -1;
  }
  return 0;
}
