func_code_string: #include <bits/stdc++.h>   using namespace std;   void read(long long &x) {     x = 0;     char c = getchar();     long long f = 1;     while (c <  0  || c >  9 ) {       if (c ==  - ) f = -f;       c = getchar();     }     while (c >=  0  && c <=  9 ) {       x = (x << 3) + (x << 1) + c -  0 ;       c = getchar();     }     x *= f;     return;   }   void print(long long x) {     if (x < 10) {       putchar(x +  0 );       return;     }     print(x / 10);     putchar(x % 10 +  0 );   }   void write(long long x) {     if (x < 0) x = -x, putchar( - );     print(x);   }   long long maxt(long long a, long long b) { return a < b ? b : a; }   long long mint(long long a, long long b) { return a < b ? a : b; }   struct node {     long long v, id;     node(long long V, long long Id) { v = V, id = Id; }   };   stack<long long> q, r;   vector<node> R[1000005], G[1000005];   vector<long long> E[1000005];   long long n, m, dfn[1000005], low[1000005], cnt, w[1000005], s[1000005],       bel[1000005], f[1000005], e[1000005], dep[1000005], col;   void tarjan(long long u, long long fa) {     q.push(u);     dfn[u] = low[u] = ++cnt;     for (int i = 0; i < R[u].size(); i++) {       long long v = R[u][i].v, id = R[u][i].id;       if (v == fa) continue;       r.push(id);       if (!dfn[v]) {         tarjan(v, u);         low[u] = mint(low[u], low[v]);         if (low[v] > dfn[u]) {           ++col;           while (r.top() != id) {             if (w[r.top()]) s[col] = 1;             r.pop();           }           r.pop();           while (q.top() != v) {             bel[q.top()] = col;             E[col].push_back(q.top());             q.pop();           }           bel[v] = col;           E[col].push_back(v);           q.pop();         }       } else         low[u] = mint(low[u], dfn[v]);     }     if (fa == -1) {       ++col;       while (!r.empty()) {         if (w[r.top()]) s[col] = 1;         r.pop();       }       while (!q.empty()) {         bel[q.top()] = col;         E[col].push_back(q.top());         q.pop();       }     }   }   void dfs(long long u, long long fa) {     f[u] = fa;     dep[u] = dep[fa] + 1;     for (int i = 0; i < G[u].size(); i++) {       long long v = G[u][i].v, id = G[u][i].id;       if (v == fa) continue;       e[v] = id;       dfs(v, u);     }   }   int main() {     read(n), read(m);     for (int i = 1; i <= m; i++) {       long long u, v;       read(u), read(v), read(w[i]);       R[u].push_back(node(v, i));       R[v].push_back(node(u, i));     }     for (int i = 1; i <= n; i++)       if (!dfn[i]) tarjan(i, -1);     for (int i = 1; i <= col; i++)       for (int j = 0; j < E[i].size(); j++) {         long long u = E[i][j];         for (int k = 0; k < R[u].size(); k++) {           long long v = R[u][k].v, id = R[u][k].id;           if (bel[u] != bel[v]) G[bel[u]].push_back(node(bel[v], id));         }       }     dfs(1, 1);     long long a, b;     bool fl = 0;     read(a), read(b);     a = bel[a], b = bel[b];     if (dep[a] < dep[b]) swap(a, b);     while (dep[a] > dep[b]) {       if (w[e[a]] || s[a]) fl = 1;       a = f[a];     }     while (a != b) {       if (w[e[a]] || w[e[b]] || s[a] || s[b]) fl = 1;       a = f[a];       b = f[b];     }     if (s[a]) fl = 1;     if (fl)       puts( YES );     else       puts( NO );   }   