#include <bits/stdc++.h>
using namespace std;
#define int int64_t
vector<vector<pair<int, int>>> g[2];
const int inf = 1e15;
vector<int> dist(int z, int M) {
int n = g[z].size();
vector<int> dist(n, inf), in_que(n);
deque<int> que = {0};
dist[0] = 0;
while(!que.empty()) {
M--;
if(M < 0) {
return {-1};
}
int v = que[0];
que.pop_front();
in_que[v] = 0;
for(auto it: g[z][v]) {
int u = it.first, c = it.second;
if(dist[v] + c < dist[u]) {
dist[u] = dist[v] + c;
if(!in_que[u]) {
in_que[u] = true;
que.push_back(u);
}
}
}
}
return dist;
}
void solve() {
int N, M;
cin >> N >> M;
g[0].assign(N, vector<pair<int, int>>());
g[1].assign(N, vector<pair<int, int>>());
for(int i = 0; i < M; i++) {
int t, u, v, c;
cin >> t >> u >> v >> c;
t--, u--, v--;
if(t == 0) {
c = -c;
swap(u, v);
} else {
c--;
}
g[0][v].push_back({u, c});
g[1][u].push_back({v, c});
}
auto le = dist(0, M);
auto ge = dist(1, M);
for(auto &it: ge) {
it = -it;
}
if(le == ge) {
cout << "YES" << endl;
for(auto it: le) {
cout << it << ' ';
}
cout << endl;
} else {
cout << "NO" << endl;
}
}
signed main() {
//freopen("input.txt", "r", stdin);
ios::sync_with_stdio(0);
cin.tie(0);
int t;
cin >> t;
while(t--) {
solve();
}
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+Cgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKI2RlZmluZSBpbnQgaW50NjRfdAoKdmVjdG9yPHZlY3RvcjxwYWlyPGludCwgaW50Pj4+IGdbMl07Cgpjb25zdCBpbnQgaW5mID0gMWUxNTsKCnZlY3RvcjxpbnQ+IGRpc3QoaW50IHosIGludCBNKSB7CglpbnQgbiA9IGdbel0uc2l6ZSgpOwoJdmVjdG9yPGludD4gZGlzdChuLCBpbmYpLCBpbl9xdWUobik7CglkZXF1ZTxpbnQ+IHF1ZSA9IHswfTsKCWRpc3RbMF0gPSAwOwoJd2hpbGUoIXF1ZS5lbXB0eSgpKSB7CgkJTS0tOwoJCWlmKE0gPCAwKSB7CgkJCXJldHVybiB7LTF9OwoJCX0KCQlpbnQgdiA9IHF1ZVswXTsKCQlxdWUucG9wX2Zyb250KCk7CgkJaW5fcXVlW3ZdID0gMDsKCQlmb3IoYXV0byBpdDogZ1t6XVt2XSkgewoJCQlpbnQgdSA9IGl0LmZpcnN0LCBjID0gaXQuc2Vjb25kOwoJCQlpZihkaXN0W3ZdICsgYyA8IGRpc3RbdV0pIHsKCQkJCWRpc3RbdV0gPSBkaXN0W3ZdICsgYzsKCQkJCWlmKCFpbl9xdWVbdV0pIHsKCQkJCQlpbl9xdWVbdV0gPSB0cnVlOwoJCQkJCXF1ZS5wdXNoX2JhY2sodSk7CgkJCQl9CgkJCX0KCQl9Cgl9CglyZXR1cm4gZGlzdDsKfQoKdm9pZCBzb2x2ZSgpIHsKCWludCBOLCBNOwoJY2luID4+IE4gPj4gTTsKCWdbMF0uYXNzaWduKE4sIHZlY3RvcjxwYWlyPGludCwgaW50Pj4oKSk7CglnWzFdLmFzc2lnbihOLCB2ZWN0b3I8cGFpcjxpbnQsIGludD4+KCkpOwoJZm9yKGludCBpID0gMDsgaSA8IE07IGkrKykgewoJCWludCB0LCB1LCB2LCBjOwoJCWNpbiA+PiB0ID4+IHUgPj4gdiA+PiBjOwoJCXQtLSwgdS0tLCB2LS07CgkJaWYodCA9PSAwKSB7CgkJCWMgPSAtYzsKCQkJc3dhcCh1LCB2KTsKCQl9IGVsc2UgewoJCQljLS07CgkJfQoJCWdbMF1bdl0ucHVzaF9iYWNrKHt1LCBjfSk7CgkJZ1sxXVt1XS5wdXNoX2JhY2soe3YsIGN9KTsKCX0KCWF1dG8gbGUgPSBkaXN0KDAsIE0pOwoJYXV0byBnZSA9IGRpc3QoMSwgTSk7Cglmb3IoYXV0byAmaXQ6IGdlKSB7CgkJaXQgPSAtaXQ7Cgl9CglpZihsZSA9PSBnZSkgewoJCWNvdXQgPDwgIllFUyIgPDwgZW5kbDsKCQlmb3IoYXV0byBpdDogbGUpIHsKCQkJY291dCA8PCBpdCA8PCAnICc7CgkJfQoJCWNvdXQgPDwgZW5kbDsKCX0gZWxzZSB7CgkJY291dCA8PCAiTk8iIDw8IGVuZGw7Cgl9Cn0KCnNpZ25lZCBtYWluKCkgewoJLy9mcmVvcGVuKCJpbnB1dC50eHQiLCAiciIsIHN0ZGluKTsKCWlvczo6c3luY193aXRoX3N0ZGlvKDApOwoJY2luLnRpZSgwKTsKCWludCB0OwoJY2luID4+IHQ7Cgl3aGlsZSh0LS0pIHsKCQlzb2x2ZSgpOwoJfQoJcmV0dXJuIDA7Cn0K