#include <bits/stdc++.h>
using namespace std;
struct TwoSat {
  int N;
  vector<vector<int> > gr;
  vector<int> values;
  TwoSat(int n = 0) : N(n), gr(2 * n) {}
  int add_var() {
    gr.emplace_back();
    gr.emplace_back();
    return N++;
  }
  void either(int f, int j) {
    f = max(2 * f, -1 - 2 * f);
    j = max(2 * j, -1 - 2 * j);
    gr[f].push_back(j ^ 1);
    gr[j].push_back(f ^ 1);
  }
  void set_value(int x) { either(x, x); }
  void imply(int f, int j) { either(~f, j); }
  void at_most_one(const vector<int>& li) {
    if ((int)(li).size() <= 1) return;
    int cur = ~li[0];
    for (int i = 2; i < ((int)(li).size()); ++i) {
      int next = add_var();
      either(cur, ~li[i]);
      either(cur, next);
      either(~li[i], next);
      cur = ~next;
    }
    either(cur, ~li[1]);
  }
  vector<int> val, comp, z;
  int time = 0;
  int dfs(int i) {
    int low = val[i] = ++time, x;
    z.push_back(i);
    for (auto& e : gr[i])
      if (!comp[e]) low = min(low, val[e] ?: dfs(e));
    if (low == val[i]) do {
        x = z.back();
        z.pop_back();
        comp[x] = low;
        if (values[x >> 1] == -1) values[x >> 1] = x & 1;
      } while (x != i);
    return val[i] = low;
  }
  bool solve() {
    values.assign(N, -1);
    val.assign(2 * N, 0);
    comp = val;
    for (int i = 0; i < (2 * N); ++i)
      if (!comp[i]) dfs(i);
    for (int i = 0; i < (N); ++i)
      if (comp[2 * i] == comp[2 * i + 1]) return 0;
    return 1;
  }
};
int main() {
  cin.sync_with_stdio(0);
  cin.tie(0);
  cin.exceptions(cin.failbit);
  int n, p, M, m;
  cin >> n >> p >> M >> m;
  M += 5;
  TwoSat sat;
  vector<int> L(M), R(M), v(p);
  for (auto& x : L) x = sat.add_var();
  for (auto& x : R) x = sat.add_var();
  for (auto& x : v) x = sat.add_var();
  for (int i = 0; i < (M - 1); ++i) {
    sat.imply(~L[i], ~L[i + 1]);
    sat.imply(~R[i + 1], ~R[i]);
    sat.either(~R[i], ~L[i + 1]);
  }
  sat.set_value(L[0]);
  sat.set_value(R[M - 5]);
  for (int i = 0; i < (n); ++i) {
    int x, y;
    cin >> x >> y;
    --x, --y;
    sat.either(v[x], v[y]);
  }
  for (int i = 0; i < (p); ++i) {
    int l, r;
    cin >> l >> r;
    sat.imply(v[i], L[l]);
    sat.imply(v[i], R[r]);
  }
  for (int i = 0; i < (m); ++i) {
    int x, y;
    cin >> x >> y;
    --x, --y;
    sat.either(~v[x], ~v[y]);
  }
  bool b = sat.solve();
  if (!b) {
    cout << -1 << endl;
    return 0;
  }
  vector<int> ans;
  int ff;
  for (int i = 0; i < (p); ++i)
    if (sat.values[v[i]]) ans.emplace_back(i);
  for (int i = 0; i < (M - 1); ++i) {
    if (sat.values[L[i]] && !sat.values[L[i + 1]]) ff = i;
  }
  for (int i = 0; i < (M); ++i) {
    int l = sat.values[L[i]];
    int r = sat.values[R[i]];
    ;
  }
  cout << (int)(ans).size() << " " << ff << endl;
  for (auto& x : ans) cout << x + 1 << " ";
  cout << endl;
}
