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>

#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>

#define sf scanf
#define pf printf
#define pb push_back
#define mp make_pair
#define PI ( acos(-1.0) )
#define mod 1000000007LL
#define IN freopen("C.in","r",stdin)
#define OUT freopen("output.txt","w",stdout)
#define FOR(i,a,b) for(i=a ; i<=b ; i++)
#define DBG pf("Hi\n")
#define INF 1000000000000000000LL
#define i64 long long int
#define eps (1e-8)
#define xx first
#define yy second
#define ln 17
#define off 8002

using namespace __gnu_pbds;
using namespace std ;

typedef tree< i64, null_type, less<i64>, rb_tree_tag, tree_order_statistics_node_update> ordered_set;
typedef pair<int, int> pii;

#define maxn 300005

pair<int,int> car[maxn] ;

int main()
{
    int n , k , s , t ;

    scanf("%d %d %d %d",&n,&k,&s,&t) ;

    for(int i=1 ; i<=n ; i++)
    {
        scanf("%d %d",&car[i].xx,&car[i].yy) ;
    }

    vector <int> pos ;
    pos.pb(0) ; pos.pb(s) ;

    for(int i=1 ; i<=k ; i++)
    {
        int v ;
        scanf("%d",&v) ;
        pos.pb(v) ;
    }

    sort( pos.begin() , pos.end() ) ;

    vector <int> dis ;
    for(int i=1 ; i<pos.size() ; i++) dis.pb( pos[i] - pos[i-1] ) ;

    sort( dis.begin() , dis.end() ) ;
    reverse( dis.begin() , dis.end() ) ;

    vector<i64> sumD ;
    sumD.pb( dis[0] ) ;
    for(int i=1 ; i<dis.size() ; i++) sumD.pb( dis[i] + sumD[i-1] ) ;

//    DBG ;

    i64 ans = INF ;

 /*   for(auto val: dis) printf("%d ",val) ;
    printf("\n") ;

    for(auto val: sumD) printf("%lld ",val) ;
    printf("\n") ; */


    for(int i=1 ; i<=n ; i++)
    {
        int f = car[i].yy ;

        if( dis[0] > f ) continue ;

        if( 2*dis[0] <= f )
        {
            if( t <= sumD[k] ) ans = min(ans , 1LL*car[i].xx) ;
            continue ;
        }

        int lo = 0 , hi = k ;

        while( lo < hi )
        {
            int mid = (lo+hi+1)/2 ;

            if( 2*dis[mid] > f ) lo = mid ;
            else hi = mid-1 ;
        }

        int j = lo ;

        i64 ret = 3*sumD[j] - 1LL*(j+1)*f + sumD[k] - sumD[j] ;

        if(ret <= t) ans = min( ans , 1LL*car[i].xx ) ;
    }

    if(ans==INF) printf("-1\n") ;
    else printf("%lld\n",ans) ;

    return 0 ;
}
