#include <bits/stdc++.h>
using namespace std;
int n, ft[100005];
void add(int x, int v) {
  for (; x; x -= x & -x) ft[x] |= v;
}
int query(int x) {
  int ans = 0;
  for (; x <= n; x += x & -x) ans |= ft[x];
  return ans;
}
class segtree {
  vector<int> st;
  vector<int> lazy;
  int n;
  void prop(int p) {
    if (lazy[p]) {
      lazy[2 * p] |= lazy[p];
      lazy[2 * p + 1] |= lazy[p];
      st[p] |= lazy[p];
      lazy[p] = 0;
    }
  }
  void update(int p, int L, int R, int i, int j, int v) {
    prop(p);
    if (j < L || R < i) return;
    if (i <= L && R <= j) {
      lazy[p] = v;
      prop(p);
      return;
    }
    int mid = (L + R) / 2;
    update(2 * p, L, mid, i, j, v);
    update(2 * p + 1, mid + 1, R, i, j, v);
    st[p] = st[2 * p] | st[2 * p + 1];
  }
  int query(int p, int L, int R, int i, int j) {
    prop(p);
    if (j < L || R < i) return 0;
    if (i <= L && R <= j) return st[p];
    int mid = (L + R) / 2;
    int ret = 0;
    ret |= query(2 * p, L, mid, i, j);
    ret |= query(2 * p + 1, mid + 1, R, i, j);
    return ret;
  }

 public:
  segtree(int n) : n(n), st(16 * n, 0), lazy(16 * n, 0) {}
  void update(int i, int j, int v) { update(1, 0, n - 1, i, j, v); }
  int query(int i, int j) { return query(1, 0, n - 1, i, j); }
  int query(int i) { return query(1, 0, n - 1, i, i); }
};
class segtreeA {
  vector<int> st;
  int n;
  void update(int p, int L, int R, int i, int v) {
    if (i < L || R < i) return;
    if (i == L && R == i) {
      st[p] = v;
      return;
    }
    int mid = (L + R) / 2;
    update(2 * p, L, mid, i, v);
    update(2 * p + 1, mid + 1, R, i, v);
    st[p] = st[2 * p] & st[2 * p + 1];
  }
  int query(int p, int L, int R, int i, int j) {
    if (j < L || R < i) return (1 << 30) - 1;
    if (i <= L && R <= j) return st[p];
    int mid = (L + R) / 2;
    int ret = query(2 * p, L, mid, i, j);
    ret &= query(2 * p + 1, mid + 1, R, i, j);
    return ret;
  }

 public:
  segtreeA(int n) : n(n), st(16 * n, 0) {}
  void update(int i, int v) { update(1, 0, n - 1, i, v); }
  int query(int i, int j) { return query(1, 0, n - 1, i, j); }
  int query(int i) { return query(1, 0, n - 1, i, i); }
};
int main() {
  int m;
  scanf("%d %d", &n, &m);
  segtree st(n);
  int l, r, q;
  pair<int, pair<int, int> > pp[100005];
  for (int i = 0; i < m; i++) {
    scanf("%d %d %d", &l, &r, &q);
    l--;
    r--;
    st.update(l, r, q);
    pp[i] = make_pair(l, make_pair(r, q));
  }
  segtreeA tmp(n);
  for (int i = 0; i < n; i++) tmp.update(i, st.query(i));
  for (int i = 0; i < m; i++) {
    l = pp[i].first;
    r = pp[i].second.first;
    q = pp[i].second.second;
    if (tmp.query(l, r) != q) {
      printf("NO\n");
      return 0;
    }
  }
  printf("YES\n");
  printf("%d", st.query(0));
  for (int i = 1; i < n; i++) printf(" %d", st.query(i));
  printf("\n");
  return 0;
}
