#include using namespace std; using ll = long long; using edge = pair; void compute_components(map> &adjacent, vector &components, ll color) { for (ll i = 0; i < components.size(); i++) { if (components[i] != -1) continue; queue q; vector visited(components.size()); q.push(i); visited[i] = true; while (!q.empty()) { ll vertex = q.front(); q.pop(); components[vertex] = i; if (!adjacent.count(vertex)) continue; for (edge adjacentEdge : adjacent[vertex]) { if (components[adjacentEdge.first] != -1) continue; if (visited[adjacentEdge.first]) continue; if (adjacentEdge.second != color) continue; q.push(adjacentEdge.first); visited[adjacentEdge.first] = true; } } } } void process() { ll n, m; cin >> n >> m; map> adjacent{}; for (ll i = 0; i < m; ++i) { ll u, v, c; cin >> u >> v >> c; adjacent[u].emplace_back(v, c); adjacent[v].emplace_back(u, c); } vector components0(n); std::fill(components0.begin(), components0.end(), -1); vector components1(n); std::fill(components1.begin(), components1.end(), -1); compute_components(adjacent, components0, 0); compute_components(adjacent, components1, 1); //////////// for (ll i = 0; i < n; i++) { if (!adjacent.count(i)) continue; for (edge adjacentEdge : adjacent[i]) { if (components0[i] == components0[adjacentEdge.first] && adjacentEdge.second == 1) { cout << "NO" << endl; return; } if (components1[i] == components1[adjacentEdge.first] && adjacentEdge.second == 0) { cout << "NO" << endl; return; } } } cout << "YES" << endl; return; } int main() { std::ios::sync_with_stdio(false); process(); cout.flush(); return 0; }