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

const int maxn = 1e5+10;
typedef long long ll;
int fa[maxn];
int fnd(int x){
    return (fa[x]<0)?x:(fa[x]=fnd(fa[x]));
}
bool uni(int a,int b){
    a=fnd(a),b=fnd(b);
    if(a==b)    return false;
    if(fa[a]>fa[b]) swap(a,b);
    fa[a]+=fa[b];
    fa[b]=a;
    return true;
}
#define yes {cout<<"Yes"<<endl;return 0;}
#define no {cout<<"No"<<endl;return 0;}
int c[maxn],u[maxn],v[maxn];
int main(){
    ios::sync_with_stdio(false);
    memset(fa,-1,sizeof fa);
    int N,Q;    ll M;
    cin>>N>>M>>Q;
    for(int i=0;i<Q;++i)
        cin>>u[i]>>v[i]>>c[i];
    for(int i=0;i<Q;++i)
        if(c[i]==0)
            uni(u[i],v[i]);
    for(int i=0;i<Q;++i)
    {
        if(c[i]==1)
            if(fnd(u[i])==fnd(v[i]))
                no
    }
    int cnt=0;
    for(int i=0;i<Q;++i)
        if(c[i]==1)
            cnt++;
    ll cu=0;
    ll MAX=0,MIN=0;
    for(int i=0;i<N;++i)
        if(fa[i]<0)
            cu++;
    if(cnt==0)
        MIN=N-1;
    else MIN=N;
    MAX = N-cu+cu*(cu-1)/2;
    //cout<<MIN<<" "<<MAX<<endl;

    if(cu==1)
        if(M==N-1)  yes
        else no
    if(cu==2)
        if(cnt==0&&M==N-1)  yes
        else no

    if(M<=MAX&&M>=MIN)  yes
    no
}

### Prompt

Generate a Cpp solution to the following problem:

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`.

Examples

Input

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


Output

Yes


Input

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


Output

No


Input

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


Output

No

### Response

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

const int maxn = 1e5+10;
typedef long long ll;
int fa[maxn];
int fnd(int x){
    return (fa[x]<0)?x:(fa[x]=fnd(fa[x]));
}
bool uni(int a,int b){
    a=fnd(a),b=fnd(b);
    if(a==b)    return false;
    if(fa[a]>fa[b]) swap(a,b);
    fa[a]+=fa[b];
    fa[b]=a;
    return true;
}
#define yes {cout<<"Yes"<<endl;return 0;}
#define no {cout<<"No"<<endl;return 0;}
int c[maxn],u[maxn],v[maxn];
int main(){
    ios::sync_with_stdio(false);
    memset(fa,-1,sizeof fa);
    int N,Q;    ll M;
    cin>>N>>M>>Q;
    for(int i=0;i<Q;++i)
        cin>>u[i]>>v[i]>>c[i];
    for(int i=0;i<Q;++i)
        if(c[i]==0)
            uni(u[i],v[i]);
    for(int i=0;i<Q;++i)
    {
        if(c[i]==1)
            if(fnd(u[i])==fnd(v[i]))
                no
    }
    int cnt=0;
    for(int i=0;i<Q;++i)
        if(c[i]==1)
            cnt++;
    ll cu=0;
    ll MAX=0,MIN=0;
    for(int i=0;i<N;++i)
        if(fa[i]<0)
            cu++;
    if(cnt==0)
        MIN=N-1;
    else MIN=N;
    MAX = N-cu+cu*(cu-1)/2;
    //cout<<MIN<<" "<<MAX<<endl;

    if(cu==1)
        if(M==N-1)  yes
        else no
    if(cu==2)
        if(cnt==0&&M==N-1)  yes
        else no

    if(M<=MAX&&M>=MIN)  yes
    no
}

```