#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;
}