#include #include #include #include #include #include #include #include #include // require sort next_permutation count __gcd reverse etc. #include // require abs exit atof atoi #include // require scanf printf #include #include // require accumulate #include // require fabs #include #include #include #include // require setw #include // require stringstream #include // require memset #include // require tolower, toupper #include // require freopen #include // require srand #define rep(i,n) for(int i=0;i<(n);i++) #define ALL(A) A.begin(), A.end() #define INF 1500*100*10 /* No.30 たこやき工場 深さ優先探索 Pi から Ri を作るのに Pi が Qi 個必要というグラフを Pi <- Qi - Ri と言う逆のグラフを作る。 N から 順にグラフを辿って葉になったら、その時点での個数 num を記録し、そのノードが葉であることを明示する。 葉でない場合、Σ (num)x(子のコスト) が 現在のノードのコストとなる */ using namespace std; typedef long long ll; typedef pair P; const int MAX_N = 105; vector

G[MAX_N]; // P (ind, cost ) int memo[MAX_N]; bool is_leaf[MAX_N]; int dfs (int curr, int num ){ int ans = 0; if (G[curr].empty() ){ is_leaf[curr] |= true; ans = num; }else{ rep (i, G[curr].size() ){ int to = G[curr][i].first; int cost = G[curr][i].second; ans += dfs (to, num*cost ); } // end rep } // end if return memo[curr] += ans; } int main() { memset (memo, 0, sizeof (memo ) ); memset (is_leaf, false, sizeof (is_leaf ) ); rep (i, MAX_N ) G[i].clear(); ios_base::sync_with_stdio(0); int N, M; cin >> N >> M; rep (i, M ){ int p, q, r; cin >> p >> q >> r; G[r].push_back (P (p, q ) ); } // end rep rep (i, MAX_N ){ if (!G[i].empty() ) sort (ALL (G[i] ) ); } // end rep dfs (N, 1 ); for (int i = 1; i < N; i++ ){ cout << (is_leaf[i] ? memo[i] : 0 ) << endl; } // end for return 0; }