#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) { if(diff & 1) a = lca[a][lca_index]; } //cout << a << " " << b << endl; if(a == b) return a; lca_index = lca_size - 1; //cout << "nexty:" << endl; while(true) { int a_next = lca[a][lca_index]; int b_next = lca[b][lca_index]; if(lca_index == 0) { if(a_next == b_next) return a_next; else return lca[a_next][0]; } //cout << " " << lca_index << ' '<< a_next << " " << b_next << endl; 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 = 1; // TODO VRATIT 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 << "lca:" << endl; /* for(int i = 0; i < n; i++) cout << " " << i << ": " << lca[i] << endl; */ //cout << "parent: " << parent << endl; //cout << "blues: " << blues << endl; //cout << "reds: " << reds << endl; /* { int x, y, res; for(int i = 0; i < n; i++) { for(int j = 0; j < n; j++) { x = i, y = j; res = lca_lookup(x, y); cout << "lookup: " << x << " ^ " << y << " => " << res << endl; } cout << endl; } // x = 4, y = 8; res = lca_lookup(x, y); cout << "lookup: " << x << " ^ " << y << " => " << res << endl; } */ bool spatny = false; 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 << "kruznicoid " << u << "<->" << v << endl; //cout << "cerveny: " << cerveny << endl; //cout << "modry: " << modry << endl; //cout << endl; if(cerveny == 1 || modry == 1) spatny = true; } return !spatny; } 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; }