#include<cstdio>
#include<vector>
using namespace std;
const int MAXN=100005,MAXH=405;

int N,H;
int in[MAXH],out[MAXH];
int cntS[MAXH],cntT[MAXH];
bool vis[MAXH];

int fa[MAXH];
int Root(int x)
{return fa[x]==0?x:(fa[x]=Root(fa[x]));}
void Union(int x,int y)
{
	int r1=Root(x),r2=Root(y);
	if(r1==r2)
		return;
	fa[r1]=r2;
}

int ID(int h,int d)
{return h*2-1+d;}

int main()
{
	scanf("%d%d",&N,&H);
	for(int i=1;i<=N;i++)
	{
		int a,b,c,d;
		scanf("%d%d%d%d",&a,&b,&c,&d);
		int u,v;
		if(c==0)
			u=ID(a,0);
		else
			u=ID(c,1);
		if(d==0)
			v=ID(b,1);
		else
			v=ID(d,0);
		out[u]++;
		in[v]++;
		vis[u]=vis[v]=true;
		Union(u,v);
		//printf("(%d,%d)->(%d,%d)          %d->%d\n",(u-1)/2+1,(u&1)^1,(v-1)/2+1,(v&1)^1,u,v);
	}
	
	for(int i=1;i<=2*H;i++)
	{
		if(in[i]-out[i]>=1)
		{
			if(i&1)
			{
				puts("NO");
				return 0;
			}
			cntT[Root(i)]+=in[i]-out[i];
		}
		if(out[i]-in[i]>=1)
		{
			if((i&1)^1)
			{
				puts("NO");
				return 0;
			}
			cntS[Root(i)]+=out[i]-in[i];
		}
	}
	for(int i=1;i<=2*H;i++)
		if(vis[i]&&fa[i]==0&&(cntS[i]!=cntT[i]||(cntS[i]==0&&cntT[i]==0)))
		{
			puts("NO");
			return 0;
		}
	puts("YES");
	
	return 0;
}
