#include <bits/stdc++.h>
using namespace std;
// DSU with parity tracking
struct ParityDSU {
vector<int> p; // parent
vector<int> rk; // rank
vector<int> xr; // xor to parent
ParityDSU(int sz = 0) {
init(sz);
}
void init(int sz) {
p.resize(sz);
rk.assign(sz, 0);
xr.assign(sz, 0);
iota(p.begin(), p.end(), 0);
}
// Returns {root, xor_value}
pair<int, int> find(int u) {
if (p[u] == u) {
return {u, 0};
}
auto [rt, x] = find(p[u]);
xr[u] ^= x;
p[u] = rt;
return {p[u], xr[u]};
}
// Add constraint: a XOR b = val
bool add(int a, int b, int val) {
auto [ra, xa] = find(a);
auto [rb, xb] = find(b);
// Same set - check if consistent
if (ra == rb) {
return (xa ^ xb) == val;
}
// Union by rank
if (rk[ra] < rk[rb]) {
swap(ra, rb);
swap(xa, xb);
}
p[rb] = ra;
xr[rb] = xa ^ xb ^ val;
if (rk[ra] == rk[rb]) {
rk[ra]++;
}
return true;
}
};
class Solution {
public:
// Check if parity queries are consistent
bool check(long long n, vector<array<long long, 3>>& qs) {
// Collect all points
vector<long long> pts;
pts.push_back(0);
for (auto& q : qs) {
pts.push_back(q[0]);
pts.push_back(q[1] + 1);
}
// Compress coordinates
sort(pts.begin(), pts.end());
pts.erase(unique(pts.begin(), pts.end()), pts.end());
auto get = [&](long long v) {
return (int)(lower_bound(pts.begin(), pts.end(), v) - pts.begin());
};
ParityDSU dsu(pts.size());
// Process queries
for (auto& q : qs) {
int l = get(q[0]);
int r = get(q[1] + 1);
int v = (int)q[2];
if (!dsu.add(l, r, v)) {
return false;
}
}
return true;
}
};
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
long long n;
int m;
cin >> n >> m;
vector<array<long long, 3>> qs(m);
for (int i = 0; i < m; i++) {
cin >> qs[i][0] >> qs[i][1] >> qs[i][2];
}
Solution sol;
bool ans = sol.check(n, qs);
cout << (ans ? "YES" : "NO") << "\n";
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgovLyBEU1Ugd2l0aCBwYXJpdHkgdHJhY2tpbmcKc3RydWN0IFBhcml0eURTVSB7CiAgICB2ZWN0b3I8aW50PiBwOyAgICAvLyBwYXJlbnQKICAgIHZlY3RvcjxpbnQ+IHJrOyAgIC8vIHJhbmsKICAgIHZlY3RvcjxpbnQ+IHhyOyAgIC8vIHhvciB0byBwYXJlbnQKICAgIAogICAgUGFyaXR5RFNVKGludCBzeiA9IDApIHsKICAgICAgICBpbml0KHN6KTsKICAgIH0KICAgIAogICAgdm9pZCBpbml0KGludCBzeikgewogICAgICAgIHAucmVzaXplKHN6KTsKICAgICAgICByay5hc3NpZ24oc3osIDApOwogICAgICAgIHhyLmFzc2lnbihzeiwgMCk7CiAgICAgICAgaW90YShwLmJlZ2luKCksIHAuZW5kKCksIDApOwogICAgfQogICAgCiAgICAvLyBSZXR1cm5zIHtyb290LCB4b3JfdmFsdWV9CiAgICBwYWlyPGludCwgaW50PiBmaW5kKGludCB1KSB7CiAgICAgICAgaWYgKHBbdV0gPT0gdSkgewogICAgICAgICAgICByZXR1cm4ge3UsIDB9OwogICAgICAgIH0KICAgICAgICAKICAgICAgICBhdXRvIFtydCwgeF0gPSBmaW5kKHBbdV0pOwogICAgICAgIHhyW3VdIF49IHg7CiAgICAgICAgcFt1XSA9IHJ0OwogICAgICAgIAogICAgICAgIHJldHVybiB7cFt1XSwgeHJbdV19OwogICAgfQogICAgCiAgICAvLyBBZGQgY29uc3RyYWludDogYSBYT1IgYiA9IHZhbAogICAgYm9vbCBhZGQoaW50IGEsIGludCBiLCBpbnQgdmFsKSB7CiAgICAgICAgYXV0byBbcmEsIHhhXSA9IGZpbmQoYSk7CiAgICAgICAgYXV0byBbcmIsIHhiXSA9IGZpbmQoYik7CiAgICAgICAgCiAgICAgICAgLy8gU2FtZSBzZXQgLSBjaGVjayBpZiBjb25zaXN0ZW50CiAgICAgICAgaWYgKHJhID09IHJiKSB7CiAgICAgICAgICAgIHJldHVybiAoeGEgXiB4YikgPT0gdmFsOwogICAgICAgIH0KICAgICAgICAKICAgICAgICAvLyBVbmlvbiBieSByYW5rCiAgICAgICAgaWYgKHJrW3JhXSA8IHJrW3JiXSkgewogICAgICAgICAgICBzd2FwKHJhLCByYik7CiAgICAgICAgICAgIHN3YXAoeGEsIHhiKTsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgcFtyYl0gPSByYTsKICAgICAgICB4cltyYl0gPSB4YSBeIHhiIF4gdmFsOwogICAgICAgIAogICAgICAgIGlmIChya1tyYV0gPT0gcmtbcmJdKSB7CiAgICAgICAgICAgIHJrW3JhXSsrOwogICAgICAgIH0KICAgICAgICAKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KfTsKCmNsYXNzIFNvbHV0aW9uIHsKcHVibGljOgogICAgLy8gQ2hlY2sgaWYgcGFyaXR5IHF1ZXJpZXMgYXJlIGNvbnNpc3RlbnQKICAgIGJvb2wgY2hlY2sobG9uZyBsb25nIG4sIHZlY3RvcjxhcnJheTxsb25nIGxvbmcsIDM+PiYgcXMpIHsKICAgICAgICAvLyBDb2xsZWN0IGFsbCBwb2ludHMKICAgICAgICB2ZWN0b3I8bG9uZyBsb25nPiBwdHM7CiAgICAgICAgcHRzLnB1c2hfYmFjaygwKTsKICAgICAgICAKICAgICAgICBmb3IgKGF1dG8mIHEgOiBxcykgewogICAgICAgICAgICBwdHMucHVzaF9iYWNrKHFbMF0pOwogICAgICAgICAgICBwdHMucHVzaF9iYWNrKHFbMV0gKyAxKTsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgLy8gQ29tcHJlc3MgY29vcmRpbmF0ZXMKICAgICAgICBzb3J0KHB0cy5iZWdpbigpLCBwdHMuZW5kKCkpOwogICAgICAgIHB0cy5lcmFzZSh1bmlxdWUocHRzLmJlZ2luKCksIHB0cy5lbmQoKSksIHB0cy5lbmQoKSk7CiAgICAgICAgCiAgICAgICAgYXV0byBnZXQgPSBbJl0obG9uZyBsb25nIHYpIHsKICAgICAgICAgICAgcmV0dXJuIChpbnQpKGxvd2VyX2JvdW5kKHB0cy5iZWdpbigpLCBwdHMuZW5kKCksIHYpIC0gcHRzLmJlZ2luKCkpOwogICAgICAgIH07CiAgICAgICAgCiAgICAgICAgUGFyaXR5RFNVIGRzdShwdHMuc2l6ZSgpKTsKICAgICAgICAKICAgICAgICAvLyBQcm9jZXNzIHF1ZXJpZXMKICAgICAgICBmb3IgKGF1dG8mIHEgOiBxcykgewogICAgICAgICAgICBpbnQgbCA9IGdldChxWzBdKTsKICAgICAgICAgICAgaW50IHIgPSBnZXQocVsxXSArIDEpOwogICAgICAgICAgICBpbnQgdiA9IChpbnQpcVsyXTsKICAgICAgICAgICAgCiAgICAgICAgICAgIGlmICghZHN1LmFkZChsLCByLCB2KSkgewogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIAogICAgICAgIHJldHVybiB0cnVlOwogICAgfQp9OwoKaW50IG1haW4oKSB7CiAgICBpb3M6OnN5bmNfd2l0aF9zdGRpbyhmYWxzZSk7CiAgICBjaW4udGllKG51bGxwdHIpOwogICAgCiAgICBsb25nIGxvbmcgbjsKICAgIGludCBtOwogICAgY2luID4+IG4gPj4gbTsKICAgIAogICAgdmVjdG9yPGFycmF5PGxvbmcgbG9uZywgMz4+IHFzKG0pOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtOyBpKyspIHsKICAgICAgICBjaW4gPj4gcXNbaV1bMF0gPj4gcXNbaV1bMV0gPj4gcXNbaV1bMl07CiAgICB9CiAgICAKICAgIFNvbHV0aW9uIHNvbDsKICAgIGJvb2wgYW5zID0gc29sLmNoZWNrKG4sIHFzKTsKICAgIAogICAgY291dCA8PCAoYW5zID8gIllFUyIgOiAiTk8iKSA8PCAiXG4iOwogICAgCiAgICByZXR1cm4gMDsKfQ==