#include using namespace std; #define ld long double #define ll long long #define int ll int n, m; int A[601010], B[601010], C[601010]; int pred[601010]; int sz[601010]; int find(int v) { if (pred[v] == v) return v; return pred[v] = find(pred[v]); } void make(int v) { pred[v] = v; sz[v] = 1; } bool merge(int a, int b) { a = find(a); b = find(b); if (a == b) return false; if (sz[a] < sz[b]) swap(a, b); pred[b] = a; sz[a] += sz[b]; return true; } bool same_inside(int a, int b) { a = find(a); b = find(b); return (a == b); } int32_t main() { ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0); cin >> n >> m; for (int i = 1; i <= m; i++) { cin >> A[i] >> B[i] >> C[i]; A[i]++; B[i]++; } for (int trg = 0; trg <= 1; trg++) { for (int i = 1; i <= n; i++) { make(i); } // cout << "====== NEW WAVE" << trg << endl; for (int i = 1; i <= m; i++) { if (C[i] != trg) continue; // cout << "MERGE " << A[i] << " " << B[i] << endl; merge(A[i], B[i]); } for (int i = 1; i <= m; i++) { if (C[i] == trg) continue; // cout << " is it true for " << A[i] << " " << B[i] << " -- " << same_inside(A[i], B[i]) << '\n'; if (same_inside(A[i], B[i])) { cout << "NO\n"; return 0; } } } cout << "YES\n"; return 0; } /* 3 3 0 1 1 0 2 1 1 2 0 */