#include #include #include #include #include #include #include #include #include #include #include using namespace std; #define MOD 1000000007 #define MOD2 998244353 #define INF ((1<<30)-1) #define LINF (1LL<<60) #define EPS (1e-10) typedef long long Int; typedef pair P; int n, m; vector

edge[110000]; vector rev[110000]; vector group[110000]; int a, b, c; bool done[110000]; Int comp[110000]; vector nodes; void dfs(int x, int last = -1){ if(done[x])return; done[x] = true; for(auto p:edge[x]){ int to = p.first; if(to == last)continue; dfs(to, x); } nodes.push_back(x); } void dfs2(int x, int g, int last = -1){ if(done[x])return; done[x] = true; group[g].push_back(x); comp[x] = g; for(auto to:rev[x]){ if(to == last)continue; dfs2(to, g, x); } } void scc(){ for(int i = 1;i <= n;i++){ dfs(i); } reverse(nodes.begin(), nodes.end()); fill(done, done + n + 1, false); for(auto node:nodes){ if(!done[node]) dfs2(node, node); } } void ok(){ cout << "Yes" << endl; exit(0); } void ng(){ cout << "No" << endl; exit(0); } bool check(int g){ int V = group[g].size(); if(V == 0)return false; int E = 0; for(auto v:group[g]){ for(auto p:edge[v]){ if(p.second == -1)continue; int to = p.first; if(comp[to] == g)E++; } } // cout << g << " " << V << " " << E << endl; if(E+1 == V)return false; return true; } int main(){ cin >> n >> m; for(int i = 0;i < m;i++){ cin >> a >> b >> c; edge[a].push_back(P(b,c)); rev[b].push_back(a); if(c==1){ edge[b].push_back(P(a,-1)); rev[a].push_back(b); } } scc(); for(int i = 1;i <= n;i++){ if(check(i))ok(); } ng(); return 0; }