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

int n,q,x,y,v,hd[100010],cnt,fa[100010];
struct node{int to,next,val; bool bo;}e[200010];
long long m;

int ask(int x) {return fa[x]==x?x:fa[x]=ask(fa[x]);}

void addedge(int x,int y,int v)
{
	e[++cnt]=(node){y,hd[x],v,0},hd[x]=cnt;
	e[++cnt]=(node){x,hd[y],v,0},hd[y]=cnt;
}

int main()
{
	scanf("%d%lld%d",&n,&m,&q);
	for (int i=1; i<=q; i++) scanf("%d%d%d",&x,&y,&v),addedge(x+1,y+1,v);
	for (int i=1; i<=n; i++) fa[i]=i;
	int cnt0=0,cnt1=0;
	for (int i=1; i<=q; i++) if (!e[i*2].val)
	{
		if (ask(e[i*2].to)==ask(e[i*2-1].to)) continue;
		fa[ask(e[i*2].to)]=ask(e[i*2-1].to),cnt0++;
	}
	for (int i=1; i<=q; i++) if (e[i*2].val)
	{
		cnt1++;
		if (ask(e[i*2].to)==ask(e[i*2-1].to)) return puts("No"),0;
	}
	cnt=n-cnt0,m-=cnt0;
	if (m>1ll*cnt*(cnt-1)/2) return puts("No"),0;
	if (m<cnt-1+(cnt1>0)) return puts("No"),0;
	puts("Yes");
	return 0;
}