#include using namespace std; using ll = long long; using vi = vector; using vvi = vector>; using pii = pair; using vll = vector; using str = string; using vstr = vector; #define PB push_back #define ALL(x) (x).begin() (x).end() #define FOR(i,s,f) for(int (i) = (s); i < (f); i++) using vpll = vector>; long long n, m; bool riesenie(vpll& kostra, vpll& query) { vector parent(n, -1); vector depth(n, 1); for (long long i = 0; i < n; i++) parent[i] = i; for (auto hrana : kostra) { long long a = hrana.first; long long b = hrana.second; while (parent[a] != a) a = parent[a]; while (parent[b] != b) b = parent[b]; if (depth[a] >= depth[b]) { parent[b] = a; depth[a] = max(depth[a], depth[b] + 1); parent[hrana.first] = a; parent[hrana.second] = a; } else { parent[a] = b; depth[b] = max(depth[b], depth[a] + 1); parent[hrana.first] = b; parent[hrana.second] = b; } } for (auto hrana : query) { long long a = hrana.first; long long b = hrana.second; while (parent[a] != a) a = parent[a]; while (parent[b] != b) b = parent[b]; parent[hrana.first] = a; parent[hrana.second] = b; if (a == b) return false; } return true; } int main(){ cin >> n >> m; vector> hrany_blue; vector> hrany_red; for (long long i = 0; i < m; i++) { long long a, b, farba; cin >> a >> b >> farba; if (farba) hrany_blue.emplace_back(make_pair(a, b)); else hrany_red.emplace_back(make_pair(a, b)); } if (riesenie(hrany_blue, hrany_red) && riesenie(hrany_red, hrany_blue)) { cout << "YES" << '\n'; } else { cout << "NO" << '\n'; } }