#include using namespace std; struct UF{ vector e; UF(int n):e(n, -1) {} int size(int x){return -e[find(x)];} int find(int x) { return e[x] < 0 ? x : find(e[x]);} bool join(int a, int b){ a = find(a); b= find(b); if (a==b) return false; if (e[a] > e[b]) swap(a,b); e[a]+=e[b]; e[b]=a; return true; } }; bool check(int n, vector> a, vector> b){ UF uf(n); for(auto [u,v]:a){ uf.join(u,v); } for(auto [u,v]:b){ if(uf.find(u) == uf.find(v)) return true; } return false; } int main(){ int n,m; cin>>n>>m; vector> ga, gb; for(int i=0; i>a>>b>>c; if(c){ ga.push_back({a,b}); } else{ gb.push_back({a,b}); } } if(check(n, ga,gb) || check(n, gb,ga)){ cout << "NO\n"; } else{ cout << "YES\n"; } }