#include using namespace std; typedef pair P; typedef long long ll; typedef long double ld; const int inf=1e9+7; const ll longinf=1LL<<60; #define REP(i,m,n) for(int i=(int)(m) ; i < (int) (n) ; ++i ) #define rep(i,n) REP(i,0,n) #define F first #define S second const int mx=100010; const ll mod=1e9+7; struct UnionFind { vector par,sizes; // par[i]:iの親の番号(ex)par[3]=2 : 3の親が2 UnionFind(int n) : par(n),sizes(n,1) { //最初は全てが根であるとして初期化 for(int i=0; i > G,R,T,C; vector vs,used,blg; SCC(){} SCC(int n):G(n),R(n),used(n),blg(n){} void add_edge(int u,int v){ G[u].emplace_back(v); R[v].emplace_back(u); } void dfs(int v){ used[v]=1; for(int u:G[v]) if(!used[u]) dfs(u); vs.emplace_back(v); } void rdfs(int v,int k){ used[v]=1; blg[v]=k; C[k].emplace_back(v); for(int u:R[v]) if(!used[u]) rdfs(u,k); } int build(){ int n=G.size(); for(int v=0;v=0;i--){ if(!used[vs[i]]){ T.emplace_back(); C.emplace_back(); rdfs(vs[i],k++); } } for(int v=0;v> n >> m; vector as(m),bs(m),cs(m); UnionFind uf(n); rep(i,m){ cin >> as[i] >> bs[i] >> cs[i]; as[i]--; bs[i]--; if(cs[i]==2) continue; if(uf.check(as[i],bs[i])){cout << "Yes" << endl; return 0;} uf.unite(as[i],bs[i]); } SCC G(n); rep(i,m){ if(cs[i]==1) continue; if(uf.check(as[i],bs[i])){cout << "Yes" << endl; return 0;} int x = uf.root(as[i]); int y = uf.root(bs[i]); G.add_edge(x,y); } int k = G.build(); if(k