#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;

struct Network_sap{
    #define Max_V 100000                 //最大点数
    #define Max_E 1000000             //最大边数
    int e,vs,vt;
    struct edge{int x,y,c;edge *next,*op;}*ls[Max_V],*fa[Max_V],*cur[Max_V],g[Max_E];
    int d[Max_V],num[Max_V];
    #undef Max_V
    #undef Max_E
    void init(){e=0; memset(ls,0,sizeof(ls));}
    void clear(){for (int i=0;i<e;i++) ls[g[i].x]=NULL; e=0;}
    void push_back(int l,int r){    //把区间内反向弧的容量推回正向弧，清空流量
        for (int i=l;i<=r;i++)
          if (i&1){
              g[i].op->c+=g[i].c;
              g[i].c=0;
          }
    }
    void refresh(int r){      //只留下前r条边
        clear();
        push_back(0,r-1);
        for (int i=0;i<r;i++){
          g[i].next=ls[g[i].x];
          ls[g[i].x]=&g[i];
        }
        e=r;
    }
    void addedge(int x,int y,int c){
        g[e].x=x; g[e].y=y; g[e].c=c; g[e].next=ls[x]; ls[x]=&g[e]; g[e].op=&g[e+1];
        e++;
        g[e].x=y; g[e].y=x; g[e].c=0; g[e].next=ls[y]; ls[y]=&g[e]; g[e].op=&g[e-1];
        e++;
//无向图加双边
 /*
        swap(x,y);
        g[e].x=x; g[e].y=y; g[e].c=c; g[e].next=ls[x]; ls[x]=&g[e]; g[e].op=&g[e+1];
        e++;
        g[e].x=y; g[e].y=x; g[e].c=0; g[e].next=ls[y]; ls[y]=&g[e]; g[e].op=&g[e-1];
        e++;
 */
    }
    #define INF 0x7FFFFFFF
    int sap(int n){     //注意是从1到n这个范围有点
        int ret=0,i,nf;
        for (i=1;i<=n;i++) d[i]=0,num[i]=0,cur[i]=ls[i];
        for (i=vs,num[0]=n;d[vs]<n;){
            edge *&t=cur[i];
            while (t && !(t->c && d[t->y]+1==d[i])) t=t->next;
            if (t){
                fa[t->y]=t;
                i=t->y;
                if (i==vt){
                    for (nf=INF;i!=vs;i=fa[i]->x) if (fa[i]->c<nf) nf=fa[i]->c;
                    for (i=vt  ;i!=vs;i=fa[i]->x) {fa[i]->c-=nf; fa[i]->op->c+=nf;}
                    ret+=nf;
                }
            }
            else{
                if (--num[d[i]]==0) return ret;   // gap
                d[i]=n;
                for (t=ls[i];t;t=t->next)
                  if (t->c && d[t->y]+1<d[i]) d[i]=d[t->y]+1;
                num[d[i]]++;
                t=ls[i];
                if (i!=vs) i=fa[i]->x;
            }
        }
        return ret;
    }
    #undef INF
}Network;

int n,m,Sum;
int Low[1000000];

void init(){
    Network.clear();
    Sum=0;
    scanf("%d%d",&n,&m);
    Network.vs=n+1;
    Network.vt=n+2;
    for (int x,y,lower,upper,i=1;i<=m;i++){
        scanf("%d%d%d%d",&x,&y,&lower,&upper);
        Network.addedge(n+1,y,lower);
        Network.addedge(x,n+2,lower);
        Network.addedge(x,y,upper-lower);
        Sum+=lower;
        Low[Network.e-1]=lower;
    }
}

void gao(){
    int ret=Network.sap(n+2);
    if (ret==Sum){
        puts("YES");
        for (int i=5;i<Network.e;i+=6)
          printf("%d\n",Low[i]+Network.g[i].c);
    }
    else puts("NO");
}

int main(){
//    freopen("input.txt","r",stdin);
    int Tc,i;
    scanf("%d",&Tc);
    Network.init();
    for (i=1;i<=Tc;i++){
        init();
        gao();
        if (i!=Tc) puts("");
    }
}