#include using namespace std; #define rep(i, a, b) for (int i = (a); i < (b); i++) #define fo(i, n) rep(i, 0, n) #define all(x) std::begin(x), std::end(x) #define sz(x) int((x).size()) #define F first #define S second #define MP make_pair #define PB push_back typedef long long ll; typedef vector vi; typedef pair pii; typedef vector vvi; typedef vector vpii; typedef vector vll; typedef pair pll; typedef vector vvll; typedef vector vpll; typedef vector vd; typedef pair pdd; typedef vector vvd; typedef vector vpdd; struct node { array edges; array comps = {{-1, -1}}; }; vector nodes; array edges; signed main() { cin.tie(0)->sync_with_stdio(0); cin.exceptions(cin.badbit | cin.failbit); ll n, m; cin >> n >> m; nodes = vector(n); fo(___, m) { ll u, v, c; cin >> u >> v >> c; nodes[u].edges[c].push_back(v); nodes[v].edges[c].push_back(u); edges[c].push_back(MP(u, v)); } fo(c, 2) { ll comp_num = 0; deque queue; fo(start, n) { if (nodes[start].comps[c] >= 0) continue; queue.push_back(start); nodes[start].comps[c] = comp_num; while (!queue.empty()) { int u = queue.front(); queue.pop_front(); for (int v : nodes[u].edges[c]) { if (nodes[v].comps[c] >= 0) continue; queue.push_back(v); nodes[v].comps[c] = comp_num; } } comp_num++; } } bool ok = true; fo(c, 2) { for (auto [u, v] : edges[c]) { if (nodes[u].comps[!c] == nodes[v].comps[!c]) ok = false; } } if (ok) cout << "YES\n"; else cout << "NO\n"; }