#include #include #include #include #include using namespace std; int main() { int n; cin >> n; vector> parents(n); vector v(n); for(int i = 0; i < n; i++) { cin >> parents[i][0] >> parents[i][1] >> v[i]; parents[i][0]--; parents[i][1]--; } vector ret; auto eval = [&](int mask) -> void { bool debugp = mask == 776000; vector cand(n); for(int i = 0; i < n; i++) { cand[i] += v[i]; cand[i] += "?"; } vector lb = v; for(int i = n-1; i >= 0; i--) { if(parents[i][0] < 0) { // unconstrained if(cand[i][1] == '?') cand[i][1] = lb[i]; continue; } int dpar = (mask&(1< cand[i][0]) return; if(cand[dpar][0] < cand[i][0]) { if(cand[dpar][1] == '?') { if(lb[dpar] > cand[i][0]) return; cand[dpar][1] = cand[i][0]; } if(cand[dpar][1] != cand[i][0]) return; } // rpar must give cand[i][1] if(cand[i][1] != '?') { if(cand[rpar][0] > cand[i][1]) return; if(cand[rpar][0] < cand[i][1]) { if(cand[rpar][1] == '?') { if(lb[rpar] > cand[i][1]) return; cand[rpar][1] = cand[i][1]; } if(cand[rpar][1] != cand[i][1]) return; } } else { lb[rpar] = max(lb[rpar], lb[i]); } } for(int i = 0; i < n; i++) { if(cand[i][1] == '?') { int rpar = (mask&(1<= cand[i][0]) now = min(now, out); } now = max(now, lb[i]); if(now == 'z') return; cand[i][1] = now; } } if(ret.size() == 0 || cand < ret) ret.swap(cand); }; for(int mask = 0; mask < (1 << n); mask++) eval(mask); if(ret.size() == 0) cout << "-1\n"; else for(auto out: ret) cout << out << "\n"; }