#include <cstdio>
#include <cstring>
#include <algorithm>
#define y1 yy

using namespace std;

namespace SETS {

int fa[405];

void init() {
  for(int i=1;i<=401;i++) fa[i]=i;
}

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

bool check(int x,int y) {
  x=find_father(x);y=find_father(y);
  return x==y;
}

void merge(int x,int y) {
  x=find_father(x);y=find_father(y);
  if (x==y) return;
  fa[x]=y;
}

}

inline int id(int x,int y,bool on) {
  int p=(!y)?x:y+200;
  if (on) {
  	if (p<=200) p+=200; else p-=200;
  }
  return p;
}

int d[405];
bool vis[405];

int main() {
  int n,m;
  scanf("%d%d",&n,&m);
  SETS::init();
  for(int i=1;i<=n;i++) {
  	int x1,x2,y1,y2;
  	scanf("%d%d%d%d",&x1,&x2,&y1,&y2);
  	int p=id(x1,y1,0),q=id(x2,y2,1);
  	vis[p]=vis[q]=1;
  	d[p]++;d[q]--;
  	SETS::merge(p,q);
  }
  int s1=0;
  for(int i=1;i<=200;i++)
    if (d[i]>0) {
    	s1+=d[i];
    	SETS::merge(i,401);
	}
	else if (d[i]<0) {
		puts("NO");
		return 0;
	}
  int s2=0;
  for(int i=201;i<=400;i++)
    if (d[i]<0) {
    	s2-=d[i];
    	SETS::merge(i,401);
	}
	else if (d[i]>0) {
		puts("NO");
		return 0;
	}
  for(int i=1;i<=400;i++)
    if (vis[i]&&!SETS::check(i,401)) {
    	puts("NO");
    	return 0;
	}
  puts("YES");
  return 0;
}