#include #include #include using namespace std; int n, m; vector>> g; vector state, tin, tout, parent; int r, b, T; int start; bool dfs(int u) { state[u] = 1; tin[u] = T++; for (auto [v, c] : g[u]) { if (state[v] == 0) { if (c) r += 1; else b += 1; //printf("%d: r=%d b=%d\n", v, r, b); if (r >= 2 && b >= 2) { if (c) r -= 1; else b -= 1; return true; } // pruning parent[v] = u; if (!dfs(v)) return false; if (c) r -= 1; else b -= 1; } else if (state[v] == 1 && v == start) { if (c) r += 1; else b += 1; if (!(r == 0 || b == 0 || (r >= 2 && b >= 2))) return false; if (c) r -= 1; else b -= 1; } } state[u] = 2; tout[u] = T++; return true; } bool runDfs(int u) { state.assign(n, 0); tin.assign(n, 0); tout.assign(n, 0); parent.assign(n, -1); r = 0; b = 0; T = 0; start = u; return dfs(u); } int main() { scanf("%d %d", &n, &m); g = vector>>(n); for (int i = 0; i < m; ++i) { int u, v, c; scanf("%d %d %d", &u, &v, &c); g[u].push_back(pair{v, c}); g[v].push_back(pair{u, c}); } bool correct = true; for (int u = 0; u < n; u++) { if (!runDfs(u)) {correct = false; break;} } if (correct) { printf("YES\n"); } else {printf("NO\n");} return 0; }