#include<stdio.h>
#include<string.h>
long long int t, n, h, r;
struct ty {
long long int x, y, z;
}p[1200];
int xianglian(long long int x, long long int y) {
return ((p[x].x - p[y].x) * (p[x].x - p[y].x)
+ (p[x].y - p[y].y) * (p[x].y - p[y].y)
+ (p[x].z - p[y].z) * (p[x].z - p[y].z) <= (4 * r * r));
}
long long int mp[1200][1200];
long long int vis[1200];
int dfs(int x, int y) {
if (x == y) return 1;
vis[x] = 1;
for (int i = 1; i <= n+1; i++) {
if (!vis[i] && mp[x][i]) { //判断x,i之间是否相连,并且不返回走;
if(dfs(i, y)) return 1; //这是最终结束函数的地方;
}
}
return 0;
}
int main() {
scanf("%lld", &t);
while (t--) {
memset(vis, 0, sizeof(vis));
memset(mp, 0, sizeof(mp));
memset(p, 0, sizeof(p));
scanf("%lld%lld%lld", &n, &h, &r);
for (long long int i = 1; i <= n; i++) {
scanf("%lld%lld%lld", &p[i].x, &p[i].y, &p[i].z);
}
for (long long int i = 1; i <= n; i++) {
for (long long int j = 1; j <= n; j++) {
if (i != j && xianglian(i, j)) mp[i][j] = 1;
if (h - p[j].z <= r) mp[j][n + 1] = 1; //判断是否有和洞顶部相连;
if (p[j].z <= r) mp[0][j] = 1; //首先判断地面和洞之间是否相连;
}
}
if (dfs(0, n + 1)) printf("Yes\n");
else printf("No\n");
}
return 0;
}