#pragma GCC optimize("O3")
#include <bits/stdc++.h>
#define pii pair<int, int>
#define vii vector<pii>
#define pb push_back
#define fi first
#define se second
using namespace std;
typedef long long ll;
const int MAXN = 1e6 + 5;
int par[MAXN];

inline int qry(int x) { return x == par[x] ? x : par[x] = qry(par[x]); }
inline void join(int u, int v) { par[qry(u)] = qry(v); }

int main() {
	int n, q; ll m;
	scanf("%d %lld %d", &n, &m, &q);
	for (int i = 0; i < n; i++) par[i] = i;
	vii edg;
	int cnt = 0;
	for (int i = 0; i < q; i++) {
		int a, b, c;
		scanf("%d %d %d", &a, &b, &c);
		if (c == 0) {
			if (qry(a) != qry(b))
				cnt++;
			join(a, b);
		} else {
			if (m == n-1)
				return !printf("No\n");
			edg.pb(make_pair(a,b));
		}
	}
	if (m == n-1)
		return !printf("Yes\n");
	for (auto it: edg)
		if (qry(it.fi) == qry(it.se))
			return !printf("No\n");
	ll tmp = 0;
	for (int i = 0; i < n; i++)
		if (qry(i) == i)
			cnt++, tmp++;
	if (cnt <= m && m <= cnt + (tmp*(tmp-3)) / 2)
		return !printf("Yes\n");
	printf("No\n");
	return 0;
}
