#include #define rep(i,a,b) for(int i = a; i < (b); ++i) #define sz(x) (int)(x).size() using namespace std; using ll = long long; using pi = pair; using vi = vector; struct Node { int label; vi succ; }; void dfs(vector& g, int u, int c) { Node& n = g[u]; if (n.label == c) return; n.label = c; for (auto v : n.succ) { dfs(g, v, c); } } using Graph = vector; bool find(Graph& a, Graph& b) { rep(u, 0, sz(b)) { for(auto v : b[u].succ) { if (u > v) continue; if (a[u].label == a[v].label) return true; } } return false; } void solve() { int n, m; cin >> n >> m; vector red(n); vector blue(n); rep(i, 0, m) { int u, v, c; cin >> u >> v >> c; auto& g = c ? blue : red; g[u].succ.push_back(v); g[v].succ.push_back(u); } for (int i = 0; i < sz(red); ++i) { if (red[i].label == 0) dfs(red, i, i + 1); } for (int i = 0; i < sz(blue); ++i) { if (blue[i].label == 0) dfs(blue, i, i + 1); } cout << (!find(red, blue) && !find(blue, red) ? "YES\n" : "NO\n"); } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); solve(); }