#include #include using namespace std; using ll = long long; // #define int ll struct edge { int to, clr; }; bool cycle(int n, int m, vector> & adj) { // clr 0 are bfsable vector comp(n, -1); int counter = 0; for (int i = 0; i < n; i++) { if (comp[i] != -1) { continue; } queue q; q.push(i); comp[i] = counter++; // prednaskovy BFS algoritmus (korektni) while (!q.empty()) { auto curr = q.front(); q.pop(); for (auto [to, clr] : adj[curr]) { if (clr != 0) continue; if (comp[to] == comp[i]) continue; // seen assert(comp[to] == -1); comp[to] = comp[i]; q.push(to); } } } for (int i = 0; i < n; i++) { for (auto [to, clr] : adj[i]) { if (clr == 0) continue; assert(comp[i] != -1); assert(comp[to] != -1); if (comp[i] == comp[to]) { return true; } } } return false; } signed main() { int n, m; cin >> n >> m; vector> adj(n); for (int i = 0; i < m; i++) { int u, v, clr; cin >> u >> v >> clr; adj[u].push_back({v, clr}); adj[v].push_back({u, clr}); } bool res = cycle(n, m, adj); if (res) { cout << "NO" << endl; return 0; } for (int i = 0; i < n; i++) { for (auto & edg : adj[i]) { edg.clr = 1 - edg.clr; } } res = cycle(n, m, adj); if (res) { cout << "NO" << endl; return 0; } cout << "YES" << endl; return 0; }