#include using namespace std; using ll = long long; #define all(x) begin(x), end(x) #define rep(i,a,b) for (auto i = a; i < (b); ++i) #define vi vector #define pii pair #define W(x) cerr << #x << ": " << (x) << "\n"; struct UF { vi p; UF(int n) : p(n, -1) {} int get(int v) { return p[v] < 0 ? v : (p[v] = get(p[v])); } bool merge(int a, int b) { a = get(a); b = get(b); if (a == b) return false; if (p[a] > p[b]) swap(a,b); p[a] += p[b]; p[b] = a; return true; } }; struct edge { int a, b; int c; }; vector egs; int n, m; bool check() { UF uf(n); rep(i,egs.begin(),egs.end()) { if(i->c){ uf.merge(i->a, i->b); } } rep(i,egs.begin(),egs.end()) { if(i->c == 0){ if(uf.get(i->a) == uf.get(i->b)){ return false; } } } return true; } int main () { cin.tie(0)->sync_with_stdio(0); cin >> n >> m; egs.reserve(m); for (int i = 0; i < m; i++){ int a, b, c; cin >> a >> b >> c; egs.push_back({a, b, c}); } bool res = check(); rep(i,egs.begin(),egs.end()) { i->c ^= 1; } res = res && check(); cout << (res? "YES" : "NO") << "\n"; return 0; }