/*
很巧妙的一道图论题，难度在于建图&猜结论。
考虑到有两种连接方式：，对于相邻的两块，左边的在上，记为正高度；右边的在上，记为负高度。
一般地，我们可以用(l,r)表示一块积木：
如果ci=0, l=ai, 否则, l=-ci。
如果di=0, r=-bi, 否则, r=di。
假设在(l',r')的右边放上(l,r)的积木，当且仅当:
	l和r'的符号不同		或		r=l'。
需要满足最左端的l是正数，最右端的r是负数。
	
考虑构造2H个点(-H,-H+1,...,-1,1,2,3,...,H)，
对于所有(li,ri)连边，
题目的要求等价于将图划分为若干不相交的路径。
且所有路径必须从正点出发，负点结束。

题目的条件等价于:
对于所有正点，出度>=入度。
对于所有负点，入度>=出度。
对于所有弱连通块，一定存在点，入度!=出度。

显然，这个是必要条件。而充分条件可以通过构造得出。
任意选择一正点出发，直到无法再走。
我们会得到两种集合：
满足条件的路径，或者一个环。

如何消去环？
根据条件3，我们可以将环与环（或路径合并），
最终一定可以找到一个路径与之合并。
*/
#include<bits/stdc++.h>
using namespace std;

const int maxn = 409;
int in[maxn], out[maxn], pa[maxn], flag[maxn];
int n, H, a, b, c, d;

int getpa(int x) {
	return pa[x] == x ? x : pa[x] = getpa(pa[x]);
}

int main() {
	scanf("%d%d", &n, &H);
	for (int i=1; i<=2*H; i++) pa[i] = i;
	for (int i=1; i<=n; i++) {
		scanf("%d%d%d%d", &a, &b, &c, &d);
		if (c) a = c + H; 
		if (!d) b = b + H; else b = d;
		out[a]++; in[b]++;
		pa[getpa(a)] = getpa(b);
	}
	//for (int i=1; i<=2*H; i++) printf("%d %d %d\n", i, in[i], out[i]);
	for (int i=1; i<=H; i++)
		if (out[i] < in[i]) { puts("NO"); return 0; }
	for (int i=H+1; i<=2*H; i++)
		if (in[i] < out[i]) { puts("NO"); return 0; }
	for (int i=1; i<=2*H; i++)
		if (in[i] != out[i]) flag[getpa(i)] = 1;
	for (int i=1; i<=2*H; i++)
		if (pa[i] == i && !flag[i] && in[i] && out[i]) { puts("NO"); return 0; }
	puts("YES");
	return 0;
}