#include<bits/stdc++.h>
using namespace std;
int T;
int n,h,r;
struct PO{
int x,y,z;
}t[1006];
int fa[1006];
queue<int>q;
inline int read(){
int f=1,x=0;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch<='9'&&ch>='0'){ x=x*10+ch-48;ch=getchar();}
return x*f;
}
inline bool dist(int i,int j){
int sum=sqrt((t[i].x-t[j].x)*(t[i].x-t[j].x)+(t[i].y-t[j].y)*(t[i].y-t[j].y)+(t[i].z-t[j].z)*(t[i].z-t[j].z));
sum-=2*r;
if(sum<=0){
return true;
}
else{
return false;
}
}
inline void init(){
for(int i=1;i<=n;i++){
fa[i]=i;
}
while(!q.empty()){
q.pop();
}
}
inline int find(int x){
return x==fa[x]?fa[x]:fa[x]=find(fa[x]);
}
int main(){
T=read();
while(T--){
n=read(),h=read(),r=read();
init();
for(int i=1;i<=n;i++){
t[i].x=read();t[i].y=read();t[i].z=read();
for(int j=1;j<i;j++){
// cout<<dist(i,j)<<endl;
if(dist(i,j)){
int a=find(i),b=find(j);
// cout<<a<<" "<<b<<"------------"<<endl;
if(t[a].z>=t[b].z){
fa[b]=a;
}
else{
fa[a]=b;
}
}
}
if(t[i].z<=r){
q.push(i);
}
}
// for(int i=1;i<=n;i++){
// cout<<fa[i]<<" ";
// }
// cout<<endl;
if(q.empty()){
printf("No\n");
continue;
}
while(!q.empty()){
int it=q.front();
if(h-t[fa[it]].z<=r){
printf("Yes\n");
break;
}
q.pop();
}
if(q.size()==0){
printf("No\n");
}
}
return 0;
}
思想就是用并查集,但用z最大的节点做fa,有没有大佬帮帮忙(悲