#include <algorithm>
#include <vector>
#include <cstdio>
#define MAX 500009
using namespace std;

struct car{
    int x, y, w, h, oldx;
    int numer, index;
    car() {};
    car(int x, int y, int w, int h, int index){
        this->x = x;
        this->h = h;
        this->index = index;
    }
};

int tab[MAX];
vector<car> przed, po;
int wysokosc;
#define DB if(0)
vector<car> merge_sort(vector<car> a, int h){
    //for(int i=0; i<a.size(); i++)printf("%d ", a[i].index);
    //printf("\n");
    if(a.size() == 1)return a;
    vector <car> p1, p2;
    int siz = a.size();
    for(int i=0; i<siz; i++){
        if(i<siz/2)p1.push_back(a[i]);
        else p2.push_back(a[i]);
    }

    p1 = merge_sort(p1, h);
    p2 = merge_sort(p2, h);

    int c = 0, b = 0;
    a.clear();
    while(c < p1.size() && b < p2.size()){
        DB printf("przerabiam %d %d\n", p1[c].index, p2[b].index);
        if(p1[c].h + p2[b].h > h){ /// bo były wstępnie posortowanie po x-ach, więc ten z p1 będzie mniejszy
            DB printf("wrzucam %d bo sie nie mieszcza\n", p1[c].index);
            a.push_back(p1[c++]);
            continue;
        }
        if(p1[c].h == p2[b].h){
            if(p1[c].index < p2[b].index)
                a.push_back(p1[c++]);
            else
                a.push_back(p2[b++]);
            //DB printf("wrzucam %d bo rowne wysokosci\n", p1[c].index);
            continue;
        }
        if(p1[c].h < p2[b].h){ /// jeśli p1[c] jest niższe to jest pierwsze, jeśli p2[b] to drugie
            DB printf("wrzucam %d bo jest nizsze\n", p1[c].index);
            a.push_back(p1[c++]);
        }
        else{
            DB printf("wrzucam %d bo jest nizsze\n", p2[b].index);
            a.push_back(p2[b++]);
        }
    }
    /// dobijam końcówki
    while(c < p1.size())
        a.push_back(p1[c++]);
    while(b < p2.size())
        a.push_back(p2[b++]);

    //for(car _car : a)printf("i: %d ", _car.index);
    //printf("\n");
    return a;
}
void clears(int n){
    przed.clear();
    po.clear();
}
bool fun2(car a, car b){
    if(a.x == b.x)return a.index < b.index;
    return a.x < b.x;
}
void wypisz(car a){
    //printf("i: %d\n", a.index);
}
int main(){
    int t;
    scanf("%d", &t);
    while(t--){
        int n, w;
        scanf("%d%d", &n, &w);
        wysokosc = w;
        int a, b, c, d;
        for(int i=1; i<=n; i++){
            scanf("%d%d%d%d", &a, &b, &c, &d);
            przed.push_back(car(a, b, abs(c-a), abs(b-d), i));
            przed.back().oldx = a;
        }
        for(int i=1; i<=n; i++){
            scanf("%d%d%d%d", &a, &b, &c, &d);
            po.push_back(car(a, b, abs(c-a), abs(b-d), i));
        }
        for(int i=1; i<=n; i++){
             po[i-1].oldx = przed[i-1].x;
        }
        sort(przed.begin(), przed.end(), fun2);
        sort(po.begin(), po.end(), fun2);

        przed = merge_sort(przed, w);
        po = merge_sort(po, w);

        bool ok = true;

        for(int i=0; i<przed.size(); i++){
            if(przed[i].index != po[i].index)ok = false;
        }

        if(ok)printf("TAK\n");
        else printf("NIE\n");
        clears(n);
    }
}
