#include using namespace std; using ll = long long; template struct SegmentTree { SegmentTree(int n) : n(n) { for (m = 2; m < n; m *= 2); t = vector(m + n + n % 2); } T &operator[](int i) { return t[m + i]; } const T &root() const { return t[1]; } void build() { for (int i = (n - 1 + m) / 2; i > 0; i--) t[i] = t[i * 2] * t[i * 2 + 1]; } void update(int i, const T &o) { for (t[i += m] = o; i /= 2, i > 0;) t[i] = t[i * 2] * t[i * 2 + 1]; } T query(int l, int r) { T o0, o1; for (l += m, r += m; l < r; l /= 2, r /= 2) { if (l & 1) o0 = o0 * t[l++]; if (r & 1) o1 = t[--r] * o1; } return o0 * o1; } vector t; int n, m; }; struct Min { constexpr Min() : v(1 << 30) {} Min(int v) : v(v) {} Min operator*(const Min &o) const { return min(v, o.v); } int v; }; struct P { bool operator<(const P &p) const { return i < p.i; } int i, b, s; }; struct Q { int l, r, b; }; int main() { ios::sync_with_stdio(false); cin.tie(0); int n, q; cin >> n >> q; vector

p(q * 2); vector x(q); for (int i = 0; i < q; i++) { int l, r, b; cin >> l >> r >> b; l--; p[i * 2 + 0] = { l, b, 0 }; p[i * 2 + 1] = { r, b, 1 }; x[i] = { l, r, b }; } sort(p.begin(), p.end()); SegmentTree st(n); multiset ms; int j = 0; for (int i = 0; i < n; i++) { while (j < q * 2 && p[j].i <= i) { if (p[j].s == 0) { ms.insert(p[j++].b); } else { ms.erase(ms.find(p[j++].b)); } } auto it = ms.end(); int t = 1; if (!ms.empty()) t = *--it; st[i].v = t; } st.build(); for (int i = 0; i < q; i++) { const auto &[l, r, b] = x[i]; if (st.query(l, r).v != b) { cout << -1 << endl; exit(0); } } for (int i = 0; i < n; i++) { cout << st[i].v << " \n"[i == n - 1]; } return 0; }