#include <bits/stdc++.h>
using namespace std;
const int inf = 0x3f3f3f3f;
int n, m, S, T;
int fir[10005 * 100], cur[10005 * 100], nxt[10005 * 100 * 2],
    to[10005 * 100 * 2], c[10005 * 100 * 2], tot = 1;
void line(int x, int y, int z) {
  nxt[++tot] = fir[x], fir[x] = tot, to[tot] = y, c[tot] = z;
  nxt[++tot] = fir[y], fir[y] = tot, to[tot] = x, c[tot] = 0;
}
int rt[10005], lc[10005 * 100], rc[10005 * 100], cov[10005 * 100], sz;
vector<pair<int, int> > in[10005], out[10005];
void upd(int i) {
  if (!cov[lc[i]]) line(i, lc[i], inf);
  if (!cov[rc[i]]) line(i, rc[i], inf);
}
void build(int &i, int l, int r) {
  if (l == r) return void(i = l);
  i = ++sz;
  int mid = (l + r) >> 1;
  build(lc[i], l, mid), build(rc[i], mid + 1, r);
  upd(i);
}
void rev(int &i, int l, int r, int x, int y) {
  if (l == r) return void(cov[i] ^= 1);
  lc[++sz] = lc[i], rc[sz] = rc[i], cov[sz] = cov[i], i = sz;
  if (x <= l && r <= y) return (void)(cov[i] ^= 1, upd(i));
  int mid = (l + r) >> 1;
  if (x <= mid) rev(lc[i], l, mid, x, y);
  if (y > mid) rev(rc[i], mid + 1, r, x, y);
  upd(i);
}
int dis[10005 * 100];
bool BFS() {
  memset(dis, -1, (sz + 1) << 2);
  static int q[10005 * 100], l, r;
  dis[q[l = r = 1] = T] = 0;
  while (l <= r) {
    int u = q[l++];
    for (int i = fir[u], v; i; i = nxt[i])
      if (c[i ^ 1] && dis[v = to[i]] == -1) dis[q[++r] = v] = dis[u] + 1;
  }
  return ~dis[S];
}
int aug(int u, int augco) {
  if (u == T) return augco;
  int need = augco, dt;
  for (int &i = cur[u]; i; i = nxt[i])
    if (c[i] && dis[u] == dis[to[i]] + 1) {
      dt = aug(to[i], min(c[i], need)), c[i] -= dt, c[i ^ 1] += dt;
      if (!(need -= dt)) return augco;
    }
  return augco - need;
}
int main() {
  scanf("%d%d", &n, &m);
  for (int i = 1, a, b, c, d; i <= m; i++)
    scanf("%d%d%d%d", &a, &b, &c, &d), in[a].push_back(make_pair(b, d)),
        out[c + 1].push_back(make_pair(b, d));
  sz = n * 2, S = 0, T = ++sz;
  for (int i = 1; i <= n; i++) line(i, T, 1);
  for (int i = 1; i <= n; i++) line(S, n + i, 1);
  build(rt[0], 1, n);
  for (int i = 1; i <= n; i++) {
    rt[i] = rt[i - 1];
    for (auto p : in[i]) rev(rt[i], 1, n, p.first, p.second);
    for (auto p : out[i]) rev(rt[i], 1, n, p.first, p.second);
    if (!cov[rt[i]]) line(n + i, rt[i], 1);
  }
  int flow = 0;
  while (BFS()) memcpy(cur, fir, (sz + 1) << 2), flow += aug(S, inf);
  printf("%d\n", flow);
}
