1 1 2 2
1000000000 1000000000
1
 1 1 1000000000 1000000000
100 1000000000
1
 1 1 10 18
5 6
5
 2 1 1000000000 2000000000
111 999999999
101 999999998
1
 4 13 400 600
13 30
1 19
1 160
1 113
58 73 15 319 194 362 128 157 336 162 77 90 96
 1 15 100 200
283 8
30 58 16 45 80 82 55 95 24 23 86 28 51 47 20
 3 2 300 400
24 68
13 65
15 113
127 177
 1 1 2 1
1 10
1
 4 2 7 15
10 9
4 4
9 3
4 10
1 6
 2 1 1000000000 2000000000
111 1000000000
101 1000000000
5
 2 1 1000000000 2000000000
111 999999998
101 999999998
1
 1 1 1000000000 1000000000
1 1000000000
1

1000000000
 -1
 5
 111
 1
 -1
 -1
 -1
 4
 101
 -1
 -1

#include <bits/stdc++.h>
using namespace std;
void solve() {}
void no() {
  cout << -1 << '\n';
  exit(0);
}
struct Edge {
  long long u, v, cost, accelerations;
  Edge(long long uu, long long vv, long long costt, long long accelerationss) {
    u = uu;
    v = vv;
    cost = costt;
    accelerations = accelerationss;
  }
};
struct Compare {
  bool operator()(Edge l, Edge r) { return l.cost < r.cost; }
};
const long long maxn = 200500;
long long c[maxn], v[maxn];
long long n, k, s, t;
multiset<Edge, Compare> S;
signed main() {
  ios::sync_with_stdio(0);
  cin.tie(0);
  cin >> n >> k >> s >> t;
  for (long long i = 1; i <= n; i++) {
    cin >> c[i] >> v[i];
  }
  long long last = 0;
  for (long long i = 1; i <= k; i++) {
    long long g;
    cin >> g;
    Edge emp = Edge(last, g, g - last, 0);
    S.emplace(emp);
    last = g;
  }
  S.emplace(Edge(last, s, s - last, 0));
  for (Edge e : S) {
    cout << e.u << " " << e.v << " " << e.cost << " " << e.accelerations
         << '\n';
  }
  long long needed = max(0LL, 2 * s - t);
  if (false) cerr << ("needed") << " is " << (needed) << '\n';
  long long ma = 0;
  for (long long i = 1; i <= needed; i++) {
    if (false) cerr << ("i") << " is " << (i) << '\n';
    if (S.empty()) no();
    Edge use = (*S.begin());
    S.erase(S.begin());
    if (false)
      cerr << "using " << use.u << " " << use.v << " " << use.cost << " "
           << use.accelerations << '\n';
    use.cost++;
    use.accelerations++;
    if (false)
      cerr << "is now " << use.u << " " << use.v << " " << use.cost << " "
           << use.accelerations << '\n';
    if (use.accelerations < (use.v - use.u)) {
      if (false) cerr << "emplacing" << '\n';
      S.emplace(use);
    }
    ma = max(ma, use.cost);
    for (Edge e : S) {
      cout << e.u << " " << e.v << " " << e.cost << " " << e.accelerations
           << '\n';
    }
    if (false) cerr << '\n';
  }
  if (false) cerr << ("ma") << " is " << (ma) << '\n';
  long long ans = INT_MAX;
  for (long long i = 1; i <= n; i++) {
    if (v[i] >= ma) {
      ans = min(ans, c[i]);
    }
  }
  cout << ans << '\n';
}
