#include using namespace std; #define int long long #define BLUE true #define RED false #define barva bool template ostream& operator<<(ostream& os, const pair& p) { os << '{'; os << p.first << ", " << p.second; return os << '}'; } template ostream& operator<<(ostream& os, const vector& v) { os << '['; for(int i = 0; i < v.size(); i++) { if(i) os << ", "; os << v[i]; } return os << ']'; } int kde_je_jednicka(int h) { int res = 0; for(; h; res++, h >>= 1); return res; } vector> lca; int lca_size; vector hloubka; int lca_lookup(int a, int b) { // A JE NIZ!!!@ if(hloubka[a] < hloubka[b]) swap(a, b); int diff = hloubka[a] - hloubka[b]; int lca_index = 0; for(; diff; lca_index++, diff >>= 1) { a = lca[a][lca_index]; } if(a == b) return a; lca_index = lca_size - 1; while(true) { int a_next = lca[a][lca_index]; if(lca_index == 0) return a_next; int b_next = lca[b][lca_index]; if(a_next == b_next) { lca_index--; continue; } a = a_next; b = b_next; } } bool solve() { int n, m; cin >> n >> m; vector>> edges(n); for(int i = 0; i < m; i++) { int x, y; barva b; cin >> x >> y >> b; //cout << b << endl; edges[x].emplace_back(y, b); edges[y].emplace_back(x, b); } //cout << edges << endl; vector visited(n); hloubka = vector(n); vector parent(n); vector reds(n); vector blues(n); int max_h = 0; set> kruznicoidy; int first_unvisited = 0; while(first_unvisited < n) { // TADY ZACINA BFS queue q; q.push(first_unvisited); visited[first_unvisited] = true; hloubka[first_unvisited] = 0; parent[first_unvisited] = first_unvisited; reds[first_unvisited] = 0; blues[first_unvisited] = 0; while(q.size()) { int v = q.front(); q.pop(); for(auto [u, b] : edges[v]) { if(visited[u]) { if(u != parent[v]) { int x = v, y = u; if(x > y) swap(x, y); kruznicoidy.emplace(x, y, b); } } else { q.push(u); visited[u] = true; parent[u] = v; int new_h = hloubka[v] + 1; hloubka[u] = new_h; max_h = max(max_h, new_h); blues[u] = blues[v]; reds[u] = reds[v]; if(b == BLUE) blues[u]++; else reds[u]++; } } while(first_unvisited < n && visited[first_unvisited]) first_unvisited++; } } //int r, s; //r = 0; s = kde_je_jednicka(r); cout << r << ": " << s << endl; //r = 1; s = kde_je_jednicka(r); cout << r << ": " << s << endl; //r = 2; s = kde_je_jednicka(r); cout << r << ": " << s << endl; //r = 3; s = kde_je_jednicka(r); cout << r << ": " << s << endl; //r = 4; s = kde_je_jednicka(r); cout << r << ": " << s << endl; lca_size = kde_je_jednicka(max_h) + 1; lca = vector>(n, vector(lca_size)); // lca lookup for(int i = 0; i < n; i++) lca[i][0] = parent[i]; for(int j = 1; j < lca_size; j++) for(int i = 0; i < n; i++) { lca[i][j] = lca[lca[i][j - 1]][j - 1]; } //cout << "lca: " << lca << endl; //cout << "blues: " << blues << endl; //cout << "reds: " << reds << endl; for(auto [u, v, b] : kruznicoidy) { int predek = lca_lookup(u, v); int cerveny = reds[u] + reds[v] - 2 * reds[predek] + (b == RED ? 1 : 0); int modry = blues[u] + blues[v] - 2 * blues[predek] + (b == BLUE ? 1 : 0); //cout << "cerveny: " << cerveny << endl; //cout << "modry: " << modry << endl; //cout << "kruznicoid " << u << "<->" << v << endl; if(cerveny == 1 || modry == 1) return false; } return true; } int32_t main() { ios::sync_with_stdio(false); cin.tie(0); int t = 1; while(t--) { if(solve()) cout << "YES" << endl; else cout << "NO" << endl; } return 0; }