#include using namespace std; vector>> AL; vector> colors; vector visited; int res = 1; int DFS(int u, int l) { visited[u] = 1; for (auto [v, c] : AL[u]) if (v != l) { //printf("%d %d | %d %d\n", u, v, colors[l].first, colors[l].second); if (visited[v] == 1) { int a = 0, b = 0; // printf("Cycle: "); for (int i = v; colors[i].first != -1; i = colors[i].first) { if (colors[i].second == 0) a++; else b++; // printf("[%d %d %d] ", i, colors[i].first, colors[i].second); } // printf("[%d %d %d] ", u, colors[u].first, colors[u].second); //printf("\n"); if (c == 0) a++; else b++; //printf("colors: %d %d\n", a, b); if (!(a == 0 || b == 0 || (a >= 2 && b >= 2))) return 0; } else { colors[u] = {v, c}; if (!DFS(v, u)) return 0; colors[u] = {-1, -1}; } } return 1; } int main() { int n, m; scanf("%d %d", &n, &m); AL.assign(n, vector>()); for (int i = 0; i < m; i++) { int u, v, c; scanf("%d %d %d", &u, &v, &c); AL[u].push_back({v, c}); AL[v].push_back({u, c}); } // for (int i = 0; i < n; ++i) { // printf("%d: ", i); // for (auto &[v, c] : AL[i]) { // printf("[%d %d] ", v, c); // } // printf("\n"); // } colors.assign(n, {-1, -1}); visited.assign(n, 0); for (int i = 0; i < n && res; ++i) if (visited[i] == 0) { res &= DFS(i, 0); } if (res) printf("YES\n"); else printf("NO\n"); return 0; }