#include <bits/stdc++.h>
using namespace std;
const long long mod = 7;
void rd(long long &x) {
  x = 0;
  char s;
  s = getchar();
  long long f = 1;
  while (!isdigit(s)) {
    if (s == '-') f -= 1;
    s = getchar();
  }
  while (isdigit(s)) {
    x = x * 10 + s - '0';
    s = getchar();
  }
  x *= f;
}
bool isp(long long x) {
  long long tt = sqrt(x * 1.0);
  for (long long i = 2; i <= tt; i++) {
    if (x % i == 0) return 0;
  }
  return 1;
}
long long quick_mod(long long a, long long b) {
  long long res = 1;
  while (b) {
    if (b & 1) {
      res = res * a;
      res %= mod;
    }
    b >>= 1;
    a = a * a;
    a %= mod;
  }
  return res;
}
long long n, k, s, t;
struct node {
  long long cost, cap;
} a[212345];
long long pos[212345];
int main() {
  cin >> n >> k >> s >> t;
  if (t < s) {
    return cout << -1 << '\n', 0;
  }
  for (long long i = 1; i <= n; i++) {
    rd(a[i].cost), rd(a[i].cap);
  }
  for (long long i = 1; i <= k; i++) {
    rd(pos[i]);
  }
  sort(pos + 1, pos + k + 1);
  pos[0] = 0;
  pos[k + 1] = s;
  long long l = 1, r = 0x3f3f3f3f3f3f3f3f;
  ;
  while (l < r) {
    long long mid = l + r;
    mid >>= 1;
    long long tem = 0;
    for (long long i = 0; i <= k; i++) {
      tem += pos[i + 1] - pos[i];
      if (mid < (pos[i + 1] - pos[i])) {
        tem = 0x3f3f3f3f3f3f3f3f;
        break;
      } else
        tem += max((long long)0,
                   (pos[i + 1] - pos[i]) - (mid - (pos[i + 1] - pos[i])));
    }
    if (tem <= t) {
      r = mid;
    } else {
      l = mid + 1;
    }
  }
  long long ans = 0x3f3f3f3f3f3f3f3f;
  for (long long i = 1; i <= n; i++) {
    if (a[i].cap >= l) {
      ans = min(ans, a[i].cost);
    }
  }
  if (ans == 0x3f3f3f3f3f3f3f3f) {
    cout << -1 << '\n';
  } else {
    cout << ans << '\n';
  }
  return 0;
}
