#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1e5 + 10;
const int INF = (1 << 30) - 1;
struct SGtree {
  int sum[MAXN << 2], v[MAXN << 2];
  bool setv[MAXN << 2];
  void build(int idx, int l, int r) {
    v[idx] = sum[idx] = 0;
    setv[idx] = false;
    if (l == r) {
      setv[idx] = true;
      return;
    }
    build(idx << 1, l, ((l + r) / 2));
    build(idx << 1 | 1, ((l + r) / 2) + 1, r);
  }
  void PushUp(int idx, int l, int r) {
    if (l == r)
      sum[idx] = v[idx];
    else
      sum[idx] = sum[idx << 1] & sum[idx << 1 | 1];
  }
  void PushDown(int idx, int l, int r) {
    if (setv[idx]) {
      v[idx << 1] |= v[idx];
      v[idx << 1 | 1] |= v[idx];
      sum[idx << 1] = v[idx << 1];
      sum[idx << 1 | 1] = v[idx << 1 | 1];
      setv[idx << 1] = setv[idx << 1 | 1] = true;
      setv[idx] = false;
    }
  }
  void update(int idx, int l, int r, int x, int y, int vx) {
    if (x <= l && r <= y) {
      setv[idx] = true;
      v[idx] |= vx;
      sum[idx] = v[idx];
      return;
    }
    PushDown(idx, l, r);
    if (x <= ((l + r) / 2)) update(idx << 1, l, ((l + r) / 2), x, y, vx);
    if (y > ((l + r) / 2)) update(idx << 1 | 1, ((l + r) / 2) + 1, r, x, y, vx);
    PushUp(idx, l, r);
  }
  int query(int idx, int l, int r, int x, int y) {
    if (x <= l && r <= y) return sum[idx];
    int ans = INF;
    PushDown(idx, l, r);
    if (x <= ((l + r) / 2)) ans &= query(idx << 1, l, ((l + r) / 2), x, y);
    if (y > ((l + r) / 2))
      ans &= query(idx << 1 | 1, ((l + r) / 2) + 1, r, x, y);
    return ans;
  }
  void PrintAns(int idx, int l, int r) {
    if (l == r) {
      if (l != 1) putchar(' ');
      printf("%d", v[idx]);
      return;
    }
    PushDown(idx, l, r);
    PrintAns(idx << 1, l, ((l + r) / 2));
    PrintAns(idx << 1 | 1, ((l + r) / 2) + 1, r);
  }
} tree;
int n, m;
int L[MAXN], R[MAXN], Q[MAXN];
int main() {
  scanf("%d%d", &n, &m);
  tree.build(1, 1, n);
  for (int i = 0; i < m; i++) {
    scanf("%d%d%d", L + i, R + i, Q + i);
    tree.update(1, 1, n, L[i], R[i], Q[i]);
  }
  for (int i = 0; i < m; i++) {
    if (Q[i] != tree.query(1, 1, n, L[i], R[i])) {
      cout << "NO" << endl;
      return 0;
    }
  }
  cout << "YES" << endl;
  tree.PrintAns(1, 1, n);
  putchar(10);
  return 0;
}
