Problem: In addition to complaints about lighting, a lot of complaints about insufficient radio signal covering has been received by Bertown city hall recently. n complaints were sent to the mayor, all of which are suspiciosly similar to each other: in the i-th complaint, one of the radio fans has mentioned that the signals of two radio stations x_i and y_i are not covering some parts of the city, and demanded that the signal of at least one of these stations can be received in the whole city.

Of cousre, the mayor of Bertown is currently working to satisfy these complaints. A new radio tower has been installed in Bertown, it can transmit a signal with any integer power from 1 to M (let's denote the signal power as f). The mayor has decided that he will choose a set of radio stations and establish a contract with every chosen station. To establish a contract with the i-th station, the following conditions should be met:

  * the signal power f should be not less than l_i, otherwise the signal of the i-th station won't cover the whole city; 
  * the signal power f should be not greater than r_i, otherwise the signal will be received by the residents of other towns which haven't established a contract with the i-th station. 



All this information was already enough for the mayor to realise that choosing the stations is hard. But after consulting with specialists, he learned that some stations the signals of some stations may interfere with each other: there are m pairs of stations (u_i, v_i) that use the same signal frequencies, and for each such pair it is impossible to establish contracts with both stations. If stations x and y use the same frequencies, and y and z use the same frequencies, it does not imply that x and z use the same frequencies.

The mayor finds it really hard to analyze this situation, so he hired you to help him. You have to choose signal power f and a set of stations to establish contracts with such that:

  * all complaints are satisfied (formally, for every i ∈ [1, n] the city establishes a contract either with station x_i, or with station y_i); 
  * no two chosen stations interfere with each other (formally, for every i ∈ [1, m] the city does not establish a contract either with station u_i, or with station v_i); 
  * for each chosen station, the conditions on signal power are met (formally, for each chosen station i the condition l_i ≤ f ≤ r_i is met). 

Input

The first line contains 4 integers n, p, M and m (2 ≤ n, p, M, m ≤ 4 ⋅ 10^5) — the number of complaints, the number of radio stations, maximum signal power and the number of interfering pairs, respectively.

Then n lines follow, which describe the complains. Each line contains two integers x_i and y_i (1 ≤ x_i < y_i ≤ p) — the indices of the radio stations mentioned in the i-th complaint). All complaints are distinct.

Then p lines follow, which describe the radio stations. Each line contains two integers l_i and r_i (1 ≤ l_i ≤ r_i ≤ M) — the constrains on signal power that should be satisfied if the city establishes a contract with the i-th station.

Then m lines follow, which describe the pairs of interfering radio stations. Each line contains two integers u_i and v_i (1 ≤ u_i < v_i ≤ p) — the indices of interfering radio stations. All these pairs are distinct.

Output

If it is impossible to choose signal power and a set of stations to meet all conditions, print -1.

Otherwise print two integers k and f in the first line — the number of stations in the chosen set and the chosen signal power, respectively. In the second line print k distinct integers from 1 to p — the indices of stations to establish contracts with (in any order). If there are multiple answers, print any of them; you don't have to minimize/maximize the number of chosen stations, and the same applies to signal power.

Examples

Input


2 4 4 2
1 3
2 3
1 4
1 2
3 4
1 4
1 2
3 4


Output


2 3
1 3 

Input


2 4 4 2
1 3
2 4
1 2
1 2
3 4
3 4
1 2
3 4


Output


-1

Solution (in CPP):

Solution:
#include <bits/stdc++.h>
using namespace std;
const int dx[4] = {1, 0, -1, 0}, dy[4] = {0, 1, 0, -1};
bool ckmin(int& a, int b) { return b < a ? a = b, true : false; }
bool ckmax(int& a, int b) { return b > a ? a = b, true : false; }
const long long linf = 4000000000000000000LL;
const long long inf = 1000000007;
const long double pi = 3.1415926535;
void pv(vector<int> a) {
  for (auto& x : a) cout << x << " ";
  cout << '\n';
}
void pv(vector<long long> a) {
  for (auto& x : a) cout << x << " ";
  cout << '\n';
}
void pv(vector<vector<int>> a) {
  for (int i = (0); i < (int(a.size())); ++i) {
    cout << i << '\n';
    pv(a[i]);
    cout << '\n';
  }
}
void pv(vector<vector<long long>> a) {
  for (int i = (0); i < (int(a.size())); ++i) {
    cout << i << '\n';
    pv(a[i]);
  }
  cout << '\n';
}
void pv(vector<string> a) {
  for (auto& x : a) cout << x << '\n';
  cout << '\n';
}
void setIO(string second) {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  if (int(second.size())) {
    freopen((second + ".in").c_str(), "r", stdin);
    if (second != "test1") freopen((second + ".out").c_str(), "w", stdout);
  }
}
struct scc {
  int mode = 0;
  vector<vector<int>> g, gr;
  bitset<1600005> used;
  vector<int> order, component;
  void dfs1(int v) {
    used[v] = true;
    for (size_t i = 0; i < g[v].size(); ++i)
      if (!used[g[v][i]]) dfs1(g[v][i]);
    order.push_back(v);
  }
  void dfs2(int v) {
    used[v] = true;
    component.push_back(v);
    for (size_t i = 0; i < gr[v].size(); ++i)
      if (!used[gr[v][i]]) dfs2(gr[v][i]);
  }
  void init(vector<vector<int>>& adj) {
    mode = 1;
    int n = int(adj.size());
    g = adj;
    for (int i = (0); i < (int(adj.size())); ++i) {
      adj[i].clear();
      adj[i].shrink_to_fit();
    }
    adj.clear();
    adj.shrink_to_fit();
    gr.resize(n);
    for (int i = (0); i < (n); ++i) {
      for (auto& x : g[i]) {
        gr[x].push_back(i);
      }
    }
  }
  vector<int> get_component() {
    assert(mode);
    int n = int(g.size());
    vector<int> ans(n);
    for (int i = (0); i < (n); ++i)
      if (!used[i]) dfs1(i);
    for (int i = (0); i < (1600005); ++i) used[i] = 0;
    int count = 0;
    for (int i = (0); i < (n); ++i) {
      int v = order[n - 1 - i];
      if (!used[v]) {
        dfs2(v);
        for (auto& x : component) ans[x] = count;
        count++;
        component.clear();
      }
    }
    for (int i = (0); i < (int(gr.size())); ++i) {
      gr[i].clear();
      gr[i].shrink_to_fit();
    }
    gr.clear();
    gr.shrink_to_fit();
    return ans;
  }
  vector<int> get_2sat() {
    int n = int(g.size()) / 2;
    vector<int> comp = get_component();
    for (int i = (0); i < (n); ++i) {
      if (comp[2 * i] == comp[2 * i + 1]) {
        return {};
      }
    }
    int k = *max_element(comp.begin(), comp.end()) + 1;
    vector<vector<int>> Adj(k);
    vector<int> sizes(k);
    vector<int> todo;
    for (int i = (0); i < (2 * n); ++i) {
      for (auto& x : g[i]) {
        if (comp[i] != comp[x]) {
          Adj[comp[i]].push_back(comp[x]);
        }
      }
    }
    for (int i = (0); i < (int(g.size())); ++i) {
      g[i].clear();
      g[i].shrink_to_fit();
    }
    g.clear();
    g.shrink_to_fit();
    vector<int> ans;
    ans.resize(2 * n, -1);
    for (int i = (0); i < (n); ++i) {
      if (comp[2 * i] < comp[2 * i + 1])
        ans[2 * i] = false, ans[2 * i + 1] = 1;
      else
        ans[2 * i] = true, ans[2 * i + 1] = 0;
    }
    return ans;
  }
};
int n, p, M, m;
int main() {
  setIO("");
  cin >> p >> n >> M >> m;
  vector<vector<int>> adj(2 * (M + n) + 2);
  for (int i = (0); i < (p); ++i) {
    int x, y;
    cin >> x >> y;
    x--, y--;
    x <<= 1, y <<= 1;
    adj[x + 1].push_back(y);
    adj[y + 1].push_back(x);
  }
  for (int i = (0); i < (n); ++i) {
    int x, y;
    cin >> x >> y;
    x--, y--;
    x <<= 1, y <<= 1;
    x += 2 * n;
    y += 2 * n;
    adj[2 * i].push_back(x);
    adj[2 * i].push_back(y + 3);
    adj[x + 1].push_back(2 * i + 1);
    adj[y + 2].push_back(2 * i + 1);
  }
  for (int i = (1); i < (M); ++i) {
    int x = 2 * i + 2 * n;
    adj[x].push_back(x - 2);
  }
  for (int i = (0); i < (M - 1); ++i) {
    int x = 2 * i + 2 * n;
    adj[x + 1].push_back(x + 3);
  }
  for (int i = (0); i < (m); ++i) {
    int x, y;
    cin >> x >> y;
    x--, y--;
    x <<= 1, y <<= 1;
    adj[x].push_back(y + 1);
    adj[y].push_back(x + 1);
  }
  scc graph;
  graph.init(adj);
  vector<int> ans = graph.get_2sat();
  if (!int(ans.size())) {
    cout << -1 << '\n';
    return 0;
  }
  int first = -1;
  for (int i = (0); i < (M + 1); ++i) {
    int x = 2 * i + 2 * n;
    if (ans[x + 1]) {
      first = i;
      break;
    }
  }
  if (first == -1) {
    cout << -1 << '\n';
    return 0;
  }
  vector<int> x;
  for (int i = (0); i < (n); ++i) {
    if (ans[2 * i]) {
      x.push_back(i);
    }
  }
  cout << int(x.size()) << " " << first << '\n';
  for (auto& a : x) cout << a + 1 << " ";
}