#include <iostream>
#include <vector>
#include <utility>
#include <queue>
using namespace std;
int main() {
int n, m, i;
cin >> n >> m;
vector<pair<int, int>> games(m);
int u, v, t;
for (i = 0; i < m; i++) {
cin >> u >> v >> t;
if (t == 1) games[i] = make_pair(u-1, v-1);
else games[i] = make_pair(v-1, u-1);
}
vector<vector<int>> graph(n, vector<int> {});
for (auto j: games) graph[j.first].push_back(j.second);
vector<int> indeg(n);
for (auto j: games) indeg[j.second]++;
int processed = 0;
bool flag = true;
queue<int> q;
for (i = 0; i < n; i++)
if (indeg[i] == 0) q.push(i);
while (!q.empty()) {
if (q.size() > 1) flag=false;
u = q.front();
q.pop();
for (auto v: graph[u]) {
indeg[v]--;
if (indeg[v] == 0) q.push(v);
}
processed++;
}
if (flag) cout << "YES\n";
else cout << "NO\n";
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8dXRpbGl0eT4KI2luY2x1ZGUgPHF1ZXVlPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCmludCBtYWluKCkgewoJaW50IG4sIG0sIGk7CgljaW4gPj4gbiA+PiBtOwoKCXZlY3RvcjxwYWlyPGludCwgaW50Pj4gZ2FtZXMobSk7CgoJaW50IHUsIHYsIHQ7Cglmb3IgKGkgPSAwOyBpIDwgbTsgaSsrKSB7CgkJY2luID4+IHUgPj4gdiA+PiB0OwoJCWlmICh0ID09IDEpIGdhbWVzW2ldID0gbWFrZV9wYWlyKHUtMSwgdi0xKTsKCQllbHNlIGdhbWVzW2ldID0gbWFrZV9wYWlyKHYtMSwgdS0xKTsKCX0KCgl2ZWN0b3I8dmVjdG9yPGludD4+IGdyYXBoKG4sIHZlY3RvcjxpbnQ+IHt9KTsKCWZvciAoYXV0byBqOiBnYW1lcykgZ3JhcGhbai5maXJzdF0ucHVzaF9iYWNrKGouc2Vjb25kKTsKCgl2ZWN0b3I8aW50PiBpbmRlZyhuKTsKCWZvciAoYXV0byBqOiBnYW1lcykgaW5kZWdbai5zZWNvbmRdKys7CgoJaW50IHByb2Nlc3NlZCA9IDA7Cglib29sIGZsYWcgPSB0cnVlOwoJcXVldWU8aW50PiBxOwoJZm9yIChpID0gMDsgaSA8IG47IGkrKykKCQlpZiAoaW5kZWdbaV0gPT0gMCkgcS5wdXNoKGkpOwoJCgl3aGlsZSAoIXEuZW1wdHkoKSkgewoJCWlmIChxLnNpemUoKSA+IDEpIGZsYWc9ZmFsc2U7CgkJdSA9IHEuZnJvbnQoKTsKCQlxLnBvcCgpOwoJCQoJCWZvciAoYXV0byB2OiBncmFwaFt1XSkgewoJCQlpbmRlZ1t2XS0tOwoJCQlpZiAoaW5kZWdbdl0gPT0gMCkgcS5wdXNoKHYpOwoJCX0KCQlwcm9jZXNzZWQrKzsKCX0KCglpZiAoZmxhZykgY291dCA8PCAiWUVTXG4iOwoJZWxzZSBjb3V0IDw8ICJOT1xuIjsKfQ==