#include<stdio.h> #include<iostream> #include<algorithm> #include<vector> #include<string.h> #include<queue> #define LL int #define inf 100000000 #define maxn 1500 using namespace std; struct pi { int to; int cost; int rev; int id; }pp; vector<pi >g[maxn]; queue<int>q; int s,t; int line[maxn],leve[maxn]; int min(int a,int b) { int p; p=a; if(b<a) p=b; return p; } void add(int a,int b,int cos,int id) { pp.to=b; pp.cost=cos; pp.id=id; pp.rev=(int)g[b].size(); g[a].push_back(pp); pp.to=a; pp.cost=0; pp.id=-1; pp.rev=(int)g[a].size()-1; g[b].push_back(pp); return ; } void bfs(void) { q.push(s); int p,f,i; while(!q.empty()) { p=q.front(); q.pop(); f=(int)g[p].size(); for(i=0;i<f;i++) { pi &e=g[p][i]; if(e.cost>0&&line[e.to]<0) { line[e.to]=line[p]+1; q.push(e.to); } } } return ; } int dfs(int v,int f) { int p; if(v==t) return f; for(int &i=leve[v];i<g[v].size();i++) { pi &e=g[v][i]; if(line[v]<line[e.to]&&e.cost>0) { p=dfs(e.to,min(f,e.cost)); if(p>0) { e.cost-=p; g[e.to][e.rev].cost+=p; return p; } } } return 0; } LL dinic() { int f; LL flow=0; while(1) { memset(line,-1,sizeof(line)); memset(leve,sizeof(leve)); line[s]=0; bfs(); if(line[t]<0) return flow; f=dfs(s,inf); if(f==0) continue; flow+=f; while((f=dfs(s,inf))>0) { flow+=f; } } } int a[20005]; struct ppi{ int x; int y; int co1; int co2; }pp1[100005]; int main() { int i,j,n,m,p,k,q; s=0; while(scanf("%d%d",&n,&m)!=EOF){ t=n+1; for(i=0;i<=n+1;i++) g[i].clear(); for(i=0;i<m;i++){ scanf("%d%d%d%d",&pp1[i].x,&pp1[i].y,&pp1[i].co1,&pp1[i].co2); add(pp1[i].x,pp1[i].y,pp1[i].co2-pp1[i].co1,i); a[pp1[i].x]+=pp1[i].co1; a[pp1[i].y]-=pp1[i].co1; } for(i=1;i<=n;i++){ if(a[i]>0) add(i,t,a[i],0); else add(s,i,-a[i],0); } p=dinic(); memset(a,sizeof(a)); k=0; f=g[0].size(); for(i=0;i<f;i++){ if(g[0][i].cost!=0){ k=1; break; } } if(k) printf("NO\n"); else{ for(i=1;i<=n;i++){ k=g[i].size(); for(j=0;j<k;j++){ if(g[i][j].id!=-1&&g[i][j].to!=s&&g[i][j].to!=t){ a[g[i][j].id]=pp1[g[i][j].id].co2-g[i][j].cost; } } } printf("YES\n"); for(i=0;i<m;i++){ printf("%d\n",a[i]); } } } }