#include<cstdio>
#include<algorithm>
#define maxn 100005
#define N 200
using namespace std;
int n,h,indeg[N*2+5],outdeg[N*2+5];
bool vis[N*2+5];
struct node { int v; node *nxt; } edge[maxn],*head[N*2+5],*ncnt;
void addedge(int u,int v)
{
	ncnt++;
	ncnt->v=v,ncnt->nxt=head[u];
	head[u]=ncnt,indeg[v]++,outdeg[u]++;
}
void dfs(int u)
{
	vis[u]=true;
	for(node *p=head[u];p;p=p->nxt)
		if(!vis[p->v]) dfs(p->v);
}
int main()
{
	scanf("%d%d",&n,&h);
	ncnt=&edge[0];
	for(int i=1;i<=n;i++) 
	{
		int a,b,c,d,l,r;
		scanf("%d%d%d%d",&a,&b,&c,&d);
		//printf(" * %d %d %d %d\n",a,b,c,d);
		l=c?(-c):a,r=d?d:(-b);
		//printf(" - %d %d\n",l,r);
		addedge(l+N,r+N);
	}
	for(int i=0;i<N;i++)
		if(indeg[i]<outdeg[i]) { printf("NO\n"); return 0; }
	for(int i=N+1;i<=N*2;i++)
		if(indeg[i]>outdeg[i]) { printf("NO\n"); return 0; }
	for(int i=0;i<=N*2;i++)
		if(outdeg[i]>indeg[i]&&!vis[i]) dfs(i);
	for(int i=0;i<=N*2;i++)
		if((indeg[i]||outdeg[i])&&!vis[i]) { printf("NO\n"); return 0; }
	printf("YES\n");
}