#include <iostream>
#include <queue>
#include <vector>
#include <math.h>
#include <cstring>
#define x first
#define y second
using namespace std;
const int N = 210,M = N * N;
typedef long long LL;
typedef pair<int,int> PII;
int d[N][N]; // d[走到距离i的时候经过了多少个j的特殊点]的距离
int h[N],e[M],ne[M],idx;
queue<PII> q;
PII p[N];
int n,m,k,r;
bool isCheck(int x1,int y1,int x2,int y2){
LL a1 = x2 - x1;
LL a2 = y2 - y1;
return (a1 * a1 + a2 * a2 <= (LL)r * r);
}
void add(int a,int b){
e[idx] = b;
ne[idx] = h[a];
h[a] = idx++;
}
int bfs(){
memset(d,0x3f,sizeof d);
q.push({1,0});
d[1][0] = 0;
while(q.size()){
auto temp = q.front();
q.pop();
int x = temp.first;
for(int i = h[x];i != -1;i = ne[i]){
//这里是每个j用的cnt都不一样,所以需要放在for循环里面
int j = e[i],cnt = temp.second;
if(j > n) cnt++;
if(cnt <= k){
/*
x -> j
这里cnt有两种可能一种是特殊点,一种是不是特殊点
如果是特殊点
d[j][cnt + 1] = d[x][cnt] + 1;
如果不是特殊点
d[j][cnt] = d[x][cnt] + 1;
*/
if(d[j][cnt] > d[x][temp.second] + 1){
d[j][cnt] = d[x][temp.second] + 1;
q.push({j,cnt});
}
}
}
}
//遍历d[2][0] -> d[2][k]找到最大的
int res = N;
for(int i = 0;i <= k;i++)
res = min(res,d[2][i]);
return res - 1;
}
int main(){
cin >> n >> m >> k >> r;
memset(h,-1,sizeof h);
for(int i = 1;i <= n;i++){
int a,b;
cin >> a >> b;
p[i] = {a,b};
}
for(int i = n + 1;i <= n + m;i++){
int a,b;
cin >> a >> b;
p[i] = {a,b};
}
for(int i = 1;i <= n + m;i++){
for(int j = i + 1;j <= n + m;j++){
if(isCheck(p[i].x,p[i].y,p[j].x,p[j].y)){
add(i,j);add(j,i);
}
}
}
cout << bfs() << endl;
return 0;
}