#include using namespace std; using ll=long long; const ll ILL=2167167167167167167; const int INF=2100000000; #define rep(i,a,b) for (int i=(int)(a);i<(int)(b);i++) #define all(p) p.begin(),p.end() template using pq_ = priority_queue, greater>; template int LB(vector &v,T a){return lower_bound(v.begin(),v.end(),a)-v.begin();} template int UB(vector &v,T a){return upper_bound(v.begin(),v.end(),a)-v.begin();} template bool chmin(T &a,T b){if(b bool chmax(T &a,T b){if(a void So(vector &v) {sort(v.begin(),v.end());} template void Sore(vector &v) {sort(v.begin(),v.end(),[](T x,T y){return x>y;});} bool yneos(bool a,bool upp=false){if(a){cout<<(upp?"YES\n":"Yes\n");}else{cout<<(upp?"NO\n":"No\n");}return a;} template void vec_out(vector &p,int ty=0){ if(ty==2){cout<<'{';for(int i=0;i<(int)p.size();i++){if(i){cout<<",";}cout<<'"'< T vec_min(vector &a){assert(!a.empty());T ans=a[0];for(auto &x:a) chmin(ans,x);return ans;} template T vec_max(vector &a){assert(!a.empty());T ans=a[0];for(auto &x:a) chmax(ans,x);return ans;} template T vec_sum(vector &a){T ans=T(0);for(auto &x:a) ans+=x;return ans;} int pop_count(long long a){int res=0;while(a){res+=(int)(a&1),a>>=1;}return res;} template T square(T a){return a * a;} void solve(); // DEAR MYSTERIES / TOMOO int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int t = 1; cin >> t; rep(i, 0, t) solve(); } void solve(){ int N, M; cin >> N >> M; struct edge { int to; int v; int ind; }; vector Z(M), L(M), R(M), X(M); vector> G(N); rep(i, 0, M) { int x, y, z, v, l, r; cin >> x >> y >> z >> v >> l >> r; x--, y--, z--; Z[i] = z; L[i] = l, R[i] = r; G[x].push_back({y, v, i}); if (x != y) G[y].push_back({x, v, i}); } vector inv(N); vector> same(N); vector same_all; { vector order(N); rep(i, 0, N) order[i] = i; sort(all(order), [&](int l, int r) { return G[l].size() < G[r].size(); }); rep(i, 0, N) inv[order[i]] = i; vector> H(N); rep(i, 0, N) { for (auto e : G[order[i]]) { e.to = inv[e.to]; if (e.to > i) { H[i].push_back(e); X[e.ind] = i; } else if (e.to == i) { same_all.push_back(e); same[i].push_back(e); } } } rep(i, 0, M) Z[i] = inv[Z[i]]; swap(H, G); } rep(i, 0, N) { sort(all(same[i]), [&](edge l, edge r) { return l.v > r.v; }); } vector A(N); vector order; vector seen(M); vector>> save(N); auto upd = [&](int i) -> void { while (!same[i].empty() && A[i] * 2 >= same[i].back().v) { order.push_back(same[i].back().ind); same[i].pop_back(); } }; rep(i, 0, N) { upd(i); for (auto e : G[i]) { if (e.v == 0) { order.push_back(e.ind); seen[e.ind] = 1; } else { save[e.to].push({e.v, e.ind}); } } } rep(rp, 0, order.size()) { int q = order[rp]; if (A[Z[q]] >= L[q]) continue; // cout << "#" << q << "\n"; // vec_out(A); for (auto e : G[Z[q]]) { if (seen[e.ind] == 1) continue; // cout << L[q] << " " << A[e.to] << " " << e.v << " " << e.ind << endl; if (L[q] + A[e.to] >= e.v) { seen[e.ind] = 1; order.push_back(e.ind); } else if (e.to != Z[q]) { // cout << 'ch' << "\n"; // vec_out(Ls[e.to]); // cout << e.v << " " << L[q] << "\n"; save[e.to].push({e.v - L[q], e.ind}); } } int ind = Z[q]; while (!save[ind].empty() && save[ind].top().first <= L[q]) { auto tmp = save[ind].top(); save[ind].pop(); if (seen[tmp.second] == 0) { seen[tmp.second] = 1; order.push_back(tmp.second); } } // vec_out(pos); A[Z[q]] = L[q]; upd(Z[q]); } rep(i, 0, N) { for (auto e : G[i]) { if (A[i] + A[e.to] >= e.v && (A[Z[e.ind]] < L[e.ind] || R[e.ind] < A[Z[e.ind]])) { cout << "-1\n"; return; } } } for (auto e : same_all) { if (A[e.to] + A[e.to] >= e.v && (A[Z[e.ind]] < L[e.ind] || R[e.ind] < A[Z[e.ind]])) { cout << "-1\n"; return; } } rep(i, 0, N) { cout << A[inv[i]] << (i + 1 == N ? "\n" : " "); } } /* * A[xi] + A[yi] < v[i] * or * li <= A[zi] <= ri * * 0 or li みたいな感じになる? * * A = [0] * N から初めて、 * 適当なところを更新という手があるが、 * 正当性が怪しいし、TLE する気しかしない * 自分より次数が大きいところだけ更新する * 次数が大きいものは、 * */