1 #include<iostream>
2 #include<cstdio>
3 #include<cstring>
4 #include<string>
5 #include<cmath>
6 #include<algorithm>
7 #include<queue>
8 #include<map>
9 #include<stack>
10 #include<vector>
11
12 using namespace std;
13 typedef long long ll;
14 const double eps=1e-6;
15 const int maxn=2e2+2;
16 const int maxm=maxn*maxn;
17 int n,m,k;
18 ll r;
19 struct node{
20 ll x;
21 ll y;
22 node(ll _x,ll _y):x(_x),y(_y){}
23 };
24 vector<node> g;
25 bool vis[maxn];
26 struct Node{
27 int id;
28 int step;
29 int k;
30 Node(int _id,int _step,int _k):id(_id),step(_step),k(_k){}
31 };
32 bool judge(int u,int v){
33 ll tmp=(g[u].x-g[v].x)*(g[u].x-g[v].x)+(g[u].y-g[v].y)*(g[u].y-g[v].y);
34 if(tmp<=r*r) return true;
35 return false;
36 }
37 struct edge{
38 int to;
39 int nxt;
40 }e[2*maxm];
41 int tot;
42 int head[maxn];
43 void init(){
44 g.clear();
45 memset(head,-1,sizeof(head));
46 tot=0;
47 memset(vis,false,sizeof(vis));
48 }
49 void add(int u,int v){
50 e[tot].to=v;
51 e[tot].nxt=head[u];
52 head[u]=tot++;
53 }
54 int bfs(){
55 int s=1,t=2;
56 queue<Node> Q;
57 Q.push(Node(s,0,0));
58 while(!Q.empty()){
59 Node q=Q.front();
60 Q.pop();
61 if(q.id==t){
62 return q.step;
63 }
64 if(vis[q.id]) continue;
65 vis[q.id]=true;
66 int u=q.id;
67 for(int i=head[u];i!=-1;i=e[i].nxt){
68 int v=e[i].to;
69 if(v<=n){
70 Q.push(Node(v,q.step+1,q.k));
71 }else{
72 if(q.k+1<=k){
73 Q.push(Node(v,q.step+1,q.k+1));
74 }
75 }
76 }
77
78 }
79 return -1;
80 }
81 int work(){
82 return bfs()-1;
83 }
84 int main(){
85 while(~scanf("%d%d%d%lld",&n,&m,&k,&r)){
86 init();
87 ll x,y;
88 g.push_back(node(0,0));
89 for(int i=1;i<=n;i++){
90 scanf("%lld%lld",&x,&y);
91 g.push_back(node(x,y));
92 }
93 for(int i=1;i<=m;i++){
94 scanf("%lld%lld",&x,&y);
95 g.push_back(node(x,y));
96 }
97 for(int i=1;i<=n+m;i++){
98 for(int j=i+1;j<=n+m;j++){
99 if(judge(i,j)){
100 add(i,j);
101 add(j,i);
102 }
103 }
104 }
105 int ans=work();
106 printf("%d\n",ans);
107 }
108 return 0;
109 }