#include using namespace std; const int INF = 1000000000; template struct sparse_table{ vector> ST; sparse_table(vector &A){ int N = A.size(); int LOG = 32 - __builtin_clz(N); ST = vector>(LOG, vector(N)); for (int i = 0; i < N; i++){ ST[0][i] = A[i]; } for (int i = 0; i < LOG - 1; i++){ for (int j = 0; j < N - (1 << i); j++){ ST[i + 1][j] = min(ST[i][j], ST[i][j + (1 << i)]); } } } T range_min(int L, int R){ int d = 31 - __builtin_clz(R - L); return min(ST[d][L], ST[d][R - (1 << d)]); } }; int main(){ int N, Q; cin >> N >> Q; vector l(Q), r(Q), B(Q); for (int i = 0; i < Q; i++){ cin >> l[i] >> r[i] >> B[i]; l[i]--; } vector> add(N + 1), sub(N + 1); for (int i = 0; i < Q; i++){ add[l[i]].push_back(B[i]); sub[r[i]].push_back(B[i]); } multiset st; st.insert(1); vector A(N); for (int i = 0; i < N; i++){ for (int x : add[i]){ st.insert(x); } for (int x : sub[i]){ st.erase(st.find(x)); } A[i] = *prev(st.end()); } sparse_table ST(A); bool ok = true; for (int i = 0; i < Q; i++){ if (ST.range_min(l[i], r[i]) != B[i]){ ok = false; } } if (!ok){ cout << -1 << endl; } else { for (int i = 0; i < N; i++){ cout << A[i]; if (i < N - 1){ cout << ' '; } } cout << endl; } }