#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
#include <stack>
using namespace std;
const int M = 2005;
int ins[M];
int dfn[M];
int low[M];
int sccf[M];
vector<int>que[M];
stack<int>s;
int index, cont;
int flag;
int n, m;
void init() {
int a, b, c, d;
index = 1;
cont = 0;
for(int i = 0; i < n*2; i++) {
que[i].clear();
}
for(int i = 0; i < m; i++) {
scanf("%d%d%d%d", &a, &b, &c, &d);
int u = a*2 + c;
int v = b*2 + d;
que[u].push_back(v^1);
que[v].push_back(u^1);
}
}
void Tanjian(int u) {
int v;
dfn[u] = low[u] = index++;
s.push(u);
ins[u] = 1;
for(int i = 0; i < que[u].size(); i++) {
v = que[u][i];
if(!dfn[v]) {
Tanjian(v);
low[u] = min(low[u], low[v]);
}
else if(ins[v]) {
low[u] = min(low[u], low[v]);
}
}
if(dfn[u] == low[u]) {
cont++;
do {
v = s.top();
s.pop();
sccf[v] = cont;
ins[v] = 0;
}while(v != u);
}
}
void solve() {
memset(ins, 0, sizeof(ins));
memset(low, 0, sizeof(low));
memset(dfn, 0, sizeof(dfn));
memset(sccf, 0, sizeof(sccf));
for(int i = 0; i < 2*n; i++) {
if(!dfn[i]) {
Tanjian(i);
}
}
flag = 1;
for(int i = 0; i < 2*n; i+= 2) {
if(sccf[i] == sccf[i^1]) {
flag = 0;
break;
}
}
if(flag)
printf("YES\n");
else
printf("NO\n");
}
int main()
{
while(scanf("%d", &n) != EOF) {
scanf("%d", &m);
init();
solve();
}
return 0;
}