#include <iostream>
#include <algorithm>
#include <string>
#include <vector>
#include <assert.h>
using namespace std;
long long readInt(long long l,long long r,char endd){
long long x=0;
int cnt=0;
int fi=-1;
bool is_neg=false;
while(true){
char g=getchar();
if(g=='-'){
assert(fi==-1);
is_neg=true;
continue;
}
if('0'<=g && g<='9'){
x*=10;
x+=g-'0';
if(cnt==0){
fi=g-'0';
}
cnt++;
assert(fi!=0 || cnt==1);
assert(fi!=0 || is_neg==false);
assert(!(cnt>19 || ( cnt==19 && fi>1) ));
} else if(g==endd){
assert(cnt>0);
if(is_neg){
x= -x;
}
if(!(l<=x && x<=r)){
cerr<<l << " "<<r<<" "<<x<<endl;
}
assert(l<=x && x<=r);
return x;
} else {
assert(false);
}
}
}
string readString(int l,int r,char endd){
string ret="";
int cnt=0;
while(true){
char g=getchar();
assert(g!=-1);
if(g==endd){
break;
}
cnt++;
ret+=g;
}
assert(l<=cnt && cnt<=r);
return ret;
}
long long readIntSp(long long l,long long r){
return readInt(l,r,' ');
}
long long readIntLn(long long l,long long r){
return readInt(l,r,'\n');
}
string readStringLn(int l,int r){
return readString(l,r,'\n');
}
string readStringSp(int l,int r){
return readString(l,r,' ');
}
struct edge{
int s,e,v;
};
edge list[5555];
int n,m;
int T;
int sm_n=0;
int sm_m=0;
long long dist[1010];
vector<int> adj[1010];
bool vis[1010];
void dfs(int nd){
vis[nd]=true;
for(int j=0;j<adj[nd].size();j++){
int ch=adj[nd][j];
if(vis[ch])continue;
dfs(ch);
}
}
int main(){
//freopen("00.txt","r",stdin);
//freopen("00o.txt","w",stdout);
T=readIntLn(1,1000);
while(T--){
cerr<<1;
n=readIntSp(2,1000);
m=readIntLn(1,5000);
sm_n+=n;
sm_m+= m;
assert(sm_n<=10000);
assert(sm_m<=50000);
for(int i=1;i<=n;i++){
dist[i]= 0;
adj[i].clear();
}
for(int i=0;i<m;i++){
int t,u,v,c;
t=readIntSp(1,2);
u=readIntSp(1,n);
v=readIntSp(1,n);
assert(u!=v);
c=readIntLn(1,1000000000);
if(t==1){
list[i].s = u;
list[i].e = v;
list[i].v = -c;
} else {
list[i].s = v;
list[i].e = u;
list[i].v = c-1;
}
}
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
dist[list[j].e] = min(dist[list[j].e],dist[list[j].s] + list[j].v);
}
}
bool ok=true;
for(int j=0;j<m;j++){
if(dist[list[j].e] > dist[list[j].s] + list[j].v){
ok=false;
}
}
if(!ok){
cout<<"NO"<<endl;
continue;
}
for(int j=0;j<m;j++){
if(dist[list[j].e] == dist[list[j].s] + list[j].v){
adj[list[j].s].push_back(list[j].e);
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
vis[j]=false;
}
dfs(i);
for(int j=1;j<=n;j++){
if(!vis[j]){
ok=false;
}
}
}
if(!ok){
cout<<"NO"<<endl;
continue;
}
cout<<"YES"<<endl;
for(int i=n;i>=1;i--){
dist[i] -= dist[1];
}
for(int i=1;i<=n;i++){
cout<<dist[i]<< " ";
}
cout<<endl;
}
assert(getchar()==-1);
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8YWxnb3JpdGhtPgojaW5jbHVkZSA8c3RyaW5nPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8YXNzZXJ0Lmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CiAKIAogCmxvbmcgbG9uZyByZWFkSW50KGxvbmcgbG9uZyBsLGxvbmcgbG9uZyByLGNoYXIgZW5kZCl7Cglsb25nIGxvbmcgeD0wOwoJaW50IGNudD0wOwoJaW50IGZpPS0xOwoJYm9vbCBpc19uZWc9ZmFsc2U7Cgl3aGlsZSh0cnVlKXsKCQljaGFyIGc9Z2V0Y2hhcigpOwoJCWlmKGc9PSctJyl7CgkJCWFzc2VydChmaT09LTEpOwoJCQlpc19uZWc9dHJ1ZTsKCQkJY29udGludWU7CgkJfQoJCWlmKCcwJzw9ZyAmJiBnPD0nOScpewoJCQl4Kj0xMDsKCQkJeCs9Zy0nMCc7CgkJCWlmKGNudD09MCl7CgkJCQlmaT1nLScwJzsKCQkJfQoJCQljbnQrKzsKCQkJYXNzZXJ0KGZpIT0wIHx8IGNudD09MSk7CgkJCWFzc2VydChmaSE9MCB8fCBpc19uZWc9PWZhbHNlKTsKCQkJCgkJCWFzc2VydCghKGNudD4xOSB8fCAoIGNudD09MTkgJiYgZmk+MSkgKSk7CgkJfSBlbHNlIGlmKGc9PWVuZGQpewoJCQlhc3NlcnQoY250PjApOwoJCQlpZihpc19uZWcpewoJCQkJeD0gLXg7CgkJCX0KCQkJaWYoIShsPD14ICYmIHg8PXIpKXsKCQkJCWNlcnI8PGwgPDwgIiAiPDxyPDwiICI8PHg8PGVuZGw7CgkJCX0KCQkJYXNzZXJ0KGw8PXggJiYgeDw9cik7CgkJCXJldHVybiB4OwoJCX0gZWxzZSB7CgkJCWFzc2VydChmYWxzZSk7CgkJfQoJfQp9CnN0cmluZyByZWFkU3RyaW5nKGludCBsLGludCByLGNoYXIgZW5kZCl7CglzdHJpbmcgcmV0PSIiOwoJaW50IGNudD0wOwoJd2hpbGUodHJ1ZSl7CgkJY2hhciBnPWdldGNoYXIoKTsKCQlhc3NlcnQoZyE9LTEpOwoJCWlmKGc9PWVuZGQpewoJCQlicmVhazsKCQl9CgkJY250Kys7CgkJcmV0Kz1nOwoJfQoJYXNzZXJ0KGw8PWNudCAmJiBjbnQ8PXIpOwoJcmV0dXJuIHJldDsKfQpsb25nIGxvbmcgcmVhZEludFNwKGxvbmcgbG9uZyBsLGxvbmcgbG9uZyByKXsKCXJldHVybiByZWFkSW50KGwsciwnICcpOwp9CmxvbmcgbG9uZyByZWFkSW50TG4obG9uZyBsb25nIGwsbG9uZyBsb25nIHIpewoJcmV0dXJuIHJlYWRJbnQobCxyLCdcbicpOwp9CnN0cmluZyByZWFkU3RyaW5nTG4oaW50IGwsaW50IHIpewoJcmV0dXJuIHJlYWRTdHJpbmcobCxyLCdcbicpOwp9CnN0cmluZyByZWFkU3RyaW5nU3AoaW50IGwsaW50IHIpewoJcmV0dXJuIHJlYWRTdHJpbmcobCxyLCcgJyk7Cn0KCgpzdHJ1Y3QgZWRnZXsKCWludCBzLGUsdjsKfTsKCgplZGdlIGxpc3RbNTU1NV07CmludCBuLG07CmludCBUOwppbnQgc21fbj0wOwppbnQgc21fbT0wOwoKbG9uZyBsb25nIGRpc3RbMTAxMF07Cgp2ZWN0b3I8aW50PiBhZGpbMTAxMF07CmJvb2wgdmlzWzEwMTBdOwoKdm9pZCBkZnMoaW50IG5kKXsKCXZpc1tuZF09dHJ1ZTsKCWZvcihpbnQgaj0wO2o8YWRqW25kXS5zaXplKCk7aisrKXsKCQlpbnQgY2g9YWRqW25kXVtqXTsKCQlpZih2aXNbY2hdKWNvbnRpbnVlOwoJCWRmcyhjaCk7Cgl9Cn0KCmludCBtYWluKCl7CgkvL2ZyZW9wZW4oIjAwLnR4dCIsInIiLHN0ZGluKTsKCS8vZnJlb3BlbigiMDBvLnR4dCIsInciLHN0ZG91dCk7CglUPXJlYWRJbnRMbigxLDEwMDApOwoJd2hpbGUoVC0tKXsKCQljZXJyPDwxOwoJCW49cmVhZEludFNwKDIsMTAwMCk7CgkJbT1yZWFkSW50TG4oMSw1MDAwKTsKCgkJc21fbis9bjsKCQlzbV9tKz0gbTsKCQlhc3NlcnQoc21fbjw9MTAwMDApOwoJCWFzc2VydChzbV9tPD01MDAwMCk7CgkJZm9yKGludCBpPTE7aTw9bjtpKyspewoJCQlkaXN0W2ldPSAwOwoJCQlhZGpbaV0uY2xlYXIoKTsKCQl9CgkJZm9yKGludCBpPTA7aTxtO2krKyl7CgkJCWludCB0LHUsdixjOwoJCQl0PXJlYWRJbnRTcCgxLDIpOwoJCQl1PXJlYWRJbnRTcCgxLG4pOwoJCQl2PXJlYWRJbnRTcCgxLG4pOwoJCQlhc3NlcnQodSE9dik7CgkJCWM9cmVhZEludExuKDEsMTAwMDAwMDAwMCk7CgkJCWlmKHQ9PTEpewoJCQkJbGlzdFtpXS5zID0gdTsKCQkJCWxpc3RbaV0uZSA9IHY7CgkJCQlsaXN0W2ldLnYgPSAtYzsKCQkJfSBlbHNlIHsKCQkJCWxpc3RbaV0ucyA9IHY7CgkJCQlsaXN0W2ldLmUgPSB1OwoJCQkJbGlzdFtpXS52ID0gYy0xOwoJCQl9CgkJfQoJCWZvcihpbnQgaT0wO2k8bjtpKyspewoJCQlmb3IoaW50IGo9MDtqPG07aisrKXsKCQkJCWRpc3RbbGlzdFtqXS5lXSA9IG1pbihkaXN0W2xpc3Rbal0uZV0sZGlzdFtsaXN0W2pdLnNdICsgbGlzdFtqXS52KTsKCQkJfQoJCX0KCQlib29sIG9rPXRydWU7CgkJZm9yKGludCBqPTA7ajxtO2orKyl7CgkJCWlmKGRpc3RbbGlzdFtqXS5lXSA+IGRpc3RbbGlzdFtqXS5zXSArIGxpc3Rbal0udil7CgkJCQlvaz1mYWxzZTsKCQkJfQoJCX0KCQlpZighb2spewoJCQljb3V0PDwiTk8iPDxlbmRsOwoJCQljb250aW51ZTsKCQl9CgkJZm9yKGludCBqPTA7ajxtO2orKyl7CgkJCWlmKGRpc3RbbGlzdFtqXS5lXSA9PSBkaXN0W2xpc3Rbal0uc10gKyBsaXN0W2pdLnYpewoJCQkJYWRqW2xpc3Rbal0uc10ucHVzaF9iYWNrKGxpc3Rbal0uZSk7CgkJCX0KCQl9CgkJZm9yKGludCBpPTE7aTw9bjtpKyspewoJCQlmb3IoaW50IGo9MTtqPD1uO2orKyl7CgkJCQl2aXNbal09ZmFsc2U7CgkJCX0KCQkJZGZzKGkpOwoJCQlmb3IoaW50IGo9MTtqPD1uO2orKyl7CgkJCQlpZighdmlzW2pdKXsKCQkJCQlvaz1mYWxzZTsKCQkJCX0KCQkJfQoJCX0KCQlpZighb2spewoJCQljb3V0PDwiTk8iPDxlbmRsOwoJCQljb250aW51ZTsKCQl9CgkJY291dDw8IllFUyI8PGVuZGw7CgkJZm9yKGludCBpPW47aT49MTtpLS0pewoJCQlkaXN0W2ldIC09IGRpc3RbMV07CgkJfQoJCWZvcihpbnQgaT0xO2k8PW47aSsrKXsKCQkJY291dDw8ZGlzdFtpXTw8ICIgIjsKCQl9CgkJY291dDw8ZW5kbDsKCX0KCglhc3NlcnQoZ2V0Y2hhcigpPT0tMSk7Cn0=