Problem:
Score : 700 points

Problem Statement

Snuke's mother gave Snuke an undirected graph consisting of N vertices numbered 0 to N-1 and M edges.
This graph was connected and contained no parallel edges or self-loops.

One day, Snuke broke this graph.
Fortunately, he remembered Q clues about the graph.
The i-th clue (0 \leq i \leq Q-1) is represented as integers A_i,B_i,C_i and means the following:

If C_i=0: there was exactly one simple path (a path that never visits the same vertex twice) from Vertex A_i to B_i.

If C_i=1: there were two or more simple paths from Vertex A_i to B_i.

Snuke is not sure if his memory is correct, and worried whether there is a graph that matches these Q clues.
Determine if there exists a graph that matches Snuke's memory.

Constraints

2 \leq N \leq 10^5

N-1 \leq M \leq N \times (N-1)/2

1 \leq Q \leq 10^5

0 \leq A_i,B_i \leq N-1

A_i \neq B_i

0 \leq C_i \leq 1

All values in input are integers.

Input

Input is given from Standard Input in the following format:

N M Q
A_0 B_0 C_0
A_1 B_1 C_1
\vdots
A_{Q-1} B_{Q-1} C_{Q-1}

Output

If there exists a graph that matches Snuke's memory, print Yes; otherwise, print No.

Sample Input 1

5 5 3
0 1 0
1 2 1
2 3 0

Sample Output 1

Yes

For example, consider a graph with edges (0,1),(1,2),(1,4),(2,3),(2,4). This graph matches the clues.

Sample Input 2

4 4 3
0 1 0
1 2 1
2 3 0

Sample Output 2

No

Sample Input 3

10 9 9
7 6 0
4 5 1
9 7 0
2 9 0
2 3 0
4 1 0
8 0 0
9 1 0
3 0 0

Sample Output 3

No

Solution in C++14 (GCC 5.4.1) (judge verdict: Wrong Answer)

#include <bits/stdc++.h>
using namespace std;
  

#define F first
#define S second
#define pb push_back
#define all(v) v.begin(),v.end()
#define sz(a) (int)a.size()
#define mod 1000000007
#define dbg(a) cout<<#a<<" = "<<a<<endl
#define dbg2(a,b) cout<<#a<<" = "<<a<<", "<<#b<<" = "<<b<<endl
#define dbg3(a,b,c) cout<<#a<<" = "<<a<<", "<<#b<<" = "<<b<<", "<<#c<<" = "<<c<<endl
#define dbg4(a,b,c,d) cout<<#a<<" = "<<a<<", "<<#b<<" = "<<b<<", "<<#c<<" = "<<c<<", "<<#d<<" = "<<d<<endl
#define ll long long
#define ld long double
#define pii pair<int,int>
#define vi vector<int>

const int nn = 1e5+5;
int par[nn], taken[nn];

int find(int u){
    if(par[u]==u) return u;
    par[u] = find(par[u]);
    return par[u];
}

void unify(int u,int v){
    u = find(u);
    v = find(v);
    if(u!=v) par[u]=v;
}

void solve()
{
    int n,m,q;cin>>n>>m>>q;
    int a[q],b[q],c[q];
    for(int i=0;i<n;i++){
        par[i]=i;
    }
    for(int i=0;i<q;i++){
        cin>>a[i]>>b[i]>>c[i];
        if(c[i]==0) unify(a[i], b[i]);
    }
    for(int i=0;i<q;i++){
        if(c[i]==0) continue;
        int u=find(a[i]), v=find(b[i]);
        if(u==v){
            cout<<"No\n";
            return;
        }
        taken[u] = taken[v] = 1;
    }
    int cnt=0, tot=0;
    for(int i=0;i<n;i++){
        int u=i;
        if(par[u]!=u) m--;
        else{
            if(taken[u]) cnt++;
            tot++;
        }
    }
    if(cnt) cnt=tot;
    else cnt=tot-1;
    // dbg3(cnt,m,tot);
    if(cnt<=m && m<= 1ll*tot*(tot-1)/2) cout<<"Yes\n";
    else cout<<"No\n";
}
 

int main()
{   
    ios_base::sync_with_stdio(0);
    cin.tie(NULL);
    cout.tie(NULL);
    cout << fixed << setprecision(13);
    clock_t beg=clock();
    int t = 1; 
    // cin>>t;
    // n = t;
    while(t--){
        // cout << "Case #" << n-t << ": ";
        solve();
    }
    //
    clock_t end=clock();
    fprintf(stderr, "%lf sec\n", (double)(end-beg)/(CLOCKS_PER_SEC));
    return 0;
}