#include using namespace std; struct Edge { int target; int color; }; enum DiscState { FRESH, IN_PROGRESS, FINISHED }; struct Tree { vector>& edges; vector& vertStates; vector& predecessors; set> chc; Tree(vector>& e, vector& s, vector& p) : edges(e), vertStates(s), predecessors(p) {} bool checkCycle(int current, int backTarget) { if (chc.count({current, backTarget}) != 0) return true; chc.insert({backTarget, current}); int count0 = 0, count1 = 0; // process the back-edge if (edges[current][backTarget].color == 0) ++count0; else ++count1; for (; current != backTarget; current = predecessors[current]) { if (edges[current][predecessors[current]].color == 0) ++count0; else ++count1; if (count0 >= 2 && count1 >= 2) return true; // this cycle is peaceful } if (count0 >= 2 && count1 >= 2) return true; // this cycle is peaceful if (count0 == 1 || count1 == 1) return false; return true; } bool dfsVisit(int vert) { vertStates[vert] = IN_PROGRESS; for (const auto& [_x, edge] : edges[vert]) { if (vertStates[edge.target] == FRESH) { predecessors[edge.target] = vert; bool result = dfsVisit(edge.target); if (result == false) return false; } else if (edge.target != predecessors[vert]) { // if pro kontrolu, ze nejde o immediate predecessora // nasli jsme cyklus if (checkCycle(vert, edge.target) == false) { cout << "cyklus je chaoticky: " << vert << " - " << edge.target << endl; return false; } else { return true; } } } return true; } }; int main() { int nVert, nEdg; cin >> nVert >> nEdg; vector> edges(nVert); for (int i = 0; i < nEdg; ++i) { int u, v, color; cin >> u >> v >> color; edges[u][v] = Edge{.target=v, .color=color}; edges[v][u] = Edge{.target=u, .color=color}; //edges[u].push_back(Edge {.target = v, .color = color}); //edges[v].push_back(Edge {.target = u, .color = color}); } vector vertStates(nVert, FRESH); vector predecessors(nVert, -1); Tree t(edges, vertStates, predecessors); for (int i = 0; i < nVert; ++i) { if (t.vertStates[i] != FRESH) continue; auto res = t.dfsVisit(i); if (res == false) { cout << "NO\n"; return 0; } } cout << "YES\n"; return 0; }