만드는 중입니다

아직 만드는 중이라 바뀔 수 있습니다

I.O.U.

면접 대비

시간 제한3초메모리 제한1024 MB

요약
친구 사이의 I.O.U. 기록이 주어질 때, 모든 순환 채무를 최소 금액만큼 줄여 없앤 뒤 남은 채무를 출력합니다.
난이도

보통10점 중 5점

유형
그래프, DFS
정답자
아직 제출이 없습니다

문제

당신은 친구 모임에서 비용을 나누는 일을 간단하게 해 주는 새 앱을 개발하고 있다. 이 앱으로 친구들은 누가 비용을 냈는지, 그리고 그 비용을 다른 사람과 어떻게 나눠야 하는지를 I.O.U.(차용증)로 기록할 수 있다. 예를 들어 Alice가 Bob, Carol과 함께 먹은 식사비를 냈고 Bob의 몫이 $5, Carol의 몫이 $10이라면, Bob은 Alice에게 $5짜리 I.O.U.를, Carol은 Alice에게 $10짜리 I.O.U.를 발행한다.

앱은 누가 누구에게 얼마를 빚졌는지 장부로 관리한다. 순환이 생길 수도 있다. 예를 들어 Bob이 처음에 Alice에게 $10을 빚졌는데 나중에 Alice를 대신해 $5 비용을 냈다면, Alice는 Bob에게 $5짜리 I.O.U.를 발행한다. 이 I.O.U.는 Alice가 Bob에게서 받을 $10의 빚을 $5로 줄이며 일부를 상쇄한다. 순환에는 세 명 이상이 얽힐 수도 있다.

앱은 발행된 I.O.U. 목록을 받아, 가능한 한 모든 순환을 찾아 각 순환에서 가장 작은 빚 금액만큼 그 순환의 모든 빚을 줄여 정산한다. 모든 순환을 찾아 상쇄한 뒤, 앱은 누가 누구에게 얼마를 빚졌는지 출력한다. 상쇄하는 방법이 여러 가지라면 어느 것을 골라도 되지만, 마지막에 순환이 남아 있지 않아야 한다. 다만 서로 I.O.U.를 주고받은 적이 없는 친구 사이에 새 I.O.U.를 만들어서는 안 된다. 예를 들어 Alice가 Bob에게 돈을 빚지고 Bob이 같은 금액을 Carol에게 빚졌다고 해서, Bob을 빼고 Alice가 Carol에게 빚졌다고 선언할 수는 없다.

입력

입력은 하나의 테스트 케이스로 이루어진다. 첫 줄에는 두 정수 nn과 mm (1≤n≤1001 \le n \le 100, 0≤m≤10 0000 \le m \le 10\,000)이 주어진다. nn은 친구의 수이고 mm은 발행된 I.O.U.의 수이다. 친구는 00부터 n−1n-1까지 번호가 매겨져 있다. 이어서 mm개의 줄에 각각 세 정수 aa, bb, cc (0≤a<n0 \le a < n, 0≤b<n0 \le b < n, a≠ba \ne b, 0<c≤1 0000 < c \le 1\,000)가 주어지며, 이는 친구 aa가 친구 bb에게 cc달러짜리 I.O.U.를 준 것을 뜻한다. 어떤 친구 ii가 다른 친구 jj(i≠ji \ne j)에게서 받는 I.O.U.는 최대 하나이지만, 친구 jj가 ii에게서 I.O.U.를 받는 동시에 친구 ii가 jj에게서 I.O.U.를 받는 것은 가능하다.

출력

먼저 모든 순환을 상쇄한 뒤 남은 I.O.U.의 개수 pp를 한 개의 수로 출력한다. 이어서 남은 pp개의 I.O.U.를 입력과 같은 형식으로 다음 pp개의 줄에 출력한다. 즉, 친구 aa가 친구 bb에게 cc달러를 빚졌다는 뜻으로 세 정수 aa, bb, cc를 출력한다. 완전히 상쇄된 I.O.U.는 출력하지 않는다. 출력하는 모든 I.O.U.의 cc는 00보다 커야 한다.

예제3

  1. 예제 1

    입력
    4 5
    0 1 10
    1 2 10
    0 3 10
    3 2 10
    2 0 20
    
    예상 출력
    0
    
  2. 예제 2

    입력
    2 2
    0 1 20
    1 0 5
    
    예상 출력
    1
    0 1 15
    
  3. 예제 3

    입력
    4 5
    0 1 10
    1 2 10
    0 3 10
    3 2 10
    2 0 10
    
    예상 출력
    2
    3 2 10
    0 3 10