- #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]);
- }
- }
- }
- }