#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+1, 0 ) != 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; }