#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 100;
int a[N], b[N];
struct node {
  int a, b, c;
};
vector<node> v;
int T[4 * N];
void inti(int n, int b, int e) {
  if (b == e) {
    T[n] = a[b];
    return;
  }
  inti(n * 2, b, (b + e) / 2);
  inti(n * 2 + 1, (b + e) / 2 + 1, e);
  T[n] = T[n * 2] & T[n * 2 + 1];
}
int query1(int n, int b, int e, int i, int j) {
  if (b > j || e < i) return 2147483647;
  if (b >= i && e <= j) return T[n];
  return query1(n * 2, b, (b + e) / 2, i, j) &
         query1(n * 2 + 1, (b + e) / 2 + 1, e, i, j);
}
int main() {
  int n, q;
  cin >> n >> q;
  while (q--) {
    node nd;
    scanf("%d%d%d", &nd.a, &nd.b, &nd.c);
    v.push_back(nd);
  }
  for (int i = 0; i <= 30; i++) {
    memset(b, 0, sizeof b);
    for (int j = 0; j < v.size(); j++) {
      int val = v[j].c;
      if (val & (1 << i)) {
        b[v[j].a]++;
        b[v[j].b + 1]--;
      }
    }
    for (int j = 1; j <= n; j++) {
      b[j] += b[j - 1];
      if (b[j]) a[j] |= (1 << i);
    }
  }
  memset(T, 0, sizeof T);
  inti(1, 1, n);
  for (int i = 0; i < v.size(); i++) {
    if (query1(1, 1, n, v[i].a, v[i].b) != v[i].c) {
      puts("NO");
      return 0;
    }
  }
  puts("YES");
  for (int i = 1; i <= n; i++) printf("%d ", a[i]);
}
