#include<iostream>
#include<algorithm>
using namespace std;
const int N = 5e5 + 10;
struct myPair {
int l, r, p;
inline bool operator<(const myPair &b) const {
return p < b.p;
}
} a[N];
int T, n, k;
namespace SegT {
int mn[4 * N];
inline int lc(int x) { return x << 1; }
inline int rc(int x) { return x << 1 | 1; }
void build(int p, int l, int r) {
mn[p] = N;
if(l == r) return;
int mid = (l + r) >> 1;
build(lc(p), l, mid);
build(rc(p), mid + 1, r);
}
void insert(int p, int l, int r, int q, int v) {
mn[p] = min(mn[p], v);
if(l == r) return;
int mid = (l + r) >> 1;
if(q <= mid) insert(lc(p), l, mid, q, v);
else insert(rc(p), mid + 1, r, q, v);
}
int query(int p, int l, int r, int ql, int qr) {
if(ql > qr) return N;
if(ql <= l && r <= qr) return mn[p];
int mid = (l + r) >> 1, res = N;
if(ql <= mid) res = min(res, query(lc(p), l, mid, ql, qr));
if(mid < qr) res = min(res, query(rc(p), mid + 1, r, ql, qr));
return res;
}
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cin >> T;
while(T--) {
cin >> n >> k;
SegT::build(1, 1, n);
for(int i = 1; i <= k; i++) cin >> a[i].l >> a[i].p >> a[i].r;
sort(a + 1, a + 1 + k);
for(int i = 1; i <= k; i++) {
if(a[i].l == 1) SegT::insert(1, 1, n, a[i].r, a[i].p);
else {
if(SegT::query(1, 1, n, a[i].l - 1, a[i].p - 1) != N || SegT::query(1, 1, n, a[i].p, a[i].r - 1) < a[i].l) {
SegT::insert(1, 1, n, a[i].r, a[i].p);
}
}
}
if(SegT::query(1, 1, n, n, n) != N) cout << "YES\n";
else cout << "NO\n";
}
return 0;
}