#include <cmath>
using namespace std;
#include <numeric>
#include <functional>
#include <iostream>
#include <algorithm>
#include <bitset>
#include <string>
#include <cstring>
#include <cstdio>
#include <queue>
#include <set>
 
//By chyx111
typedef pair<int,int> pii;
#define Rep(i,n) for(int n_ = (n), i = 0; i< n_; ++i)
 
const int MAXN = 128;
int G[ MAXN ][ MAXN ], flow[ MAXN ], pnt[ MAXN ];
int add[ MAXN ][ MAXN ];
 
// E是具体题目的数据,与模板无关
int E[ MAXN*MAXN ][ 3 ];
 
bitset< MAXN > mk;
int oo = 0x0f0f0f0f;
int n, m;
 
int augment(){
    mk.reset();
    memset(flow,0,(sizeof flow));
    flow[0] = oo;
    priority_queue<pii> Q;
    Q.push( pii(oo,0) );
    mk.reset();
    while( !Q.empty() ){
        int cur = Q.top().second; Q.pop();
        mk[cur] = true;
        if( cur == n+1){
            for(int i = cur; i != 0; i = pnt[i] ){
                G[pnt[i]][i] -= flow[n+1];
                G[i][pnt[i]] += flow[n+1];
     
                add[pnt[i]][i] += flow[n+1];
                add[i][pnt[i]] -= flow[n+1];
            }
            return flow[n+1];
        }
        for(int i = 1; i <= n+1; ++i)if( !mk[i] && G[cur][i] && flow[i] < G[cur][i] && flow[i] < flow[cur] ){
            flow[i] = min( flow[cur], G[cur][i] );
            pnt[i] = cur;
            Q.push( pii(flow[i], i ) );
        }
    }
    return 0;
}
 
int maxflow(){
    int add;
    int ans = 0;
    while( add = augment() ){
//      cout << "augment: " << add << endl;
        ans += add;
    }
    return ans;
}
 
int main() {
    while(cin >> n >> m){
        memset(G,0,(sizeof G));
        memset(add,0,(sizeof add));
        G[0][1] = oo;
        G[n][n+1] = oo;
        Rep(i,m){
            int a, b, c, d;
            scanf("%d%d%d%d", &a, &b, &c, &d);
            E[i][0] = a; E[i][1] = b; E[i][2] = c;
            if(d){
                G[0][b] += c;
                G[a][n+1] += c;
            }else{
                G[a][b] = G[b][a] = c;
                E[i][2] = 0;
            }
        }
        bool ok = true;
        int flow = maxflow(); 
        if( count( G[0]+2, G[0]+n+10 ) != n-1) ok = false;
 
        if( ok ){
            cout << add[0][1] << endl;
            Rep(i,m){
                if(i) putchar(' ');
                printf("%d", E[i][2] + max(add[E[i][0]][E[i][1]],add[E[i][1]][E[i][0]]));
            }
            puts("");
        }else{
            puts("Impossible");
        }
    }
    return 0;
}
posted on 2012-05-29 21:54  有间博客  阅读(604)  评论(0编辑  收藏  举报