← Home
package main

import (
	"bufio"
	"io"
	"os"
	"strconv"
)

type Edge struct {
	to int
	w  int64
}

type FastScanner struct {
	data []byte
	idx  int
	n    int
}

func NewFastScanner() *FastScanner {
	data, _ := io.ReadAll(os.Stdin)
	return &FastScanner{data: data, n: len(data)}
}

func (fs *FastScanner) NextInt() int {
	for fs.idx < fs.n && (fs.data[fs.idx] < '0' || fs.data[fs.idx] > '9') {
		fs.idx++
	}
	val := 0
	for fs.idx < fs.n && fs.data[fs.idx] >= '0' && fs.data[fs.idx] <= '9' {
		val = val*10 + int(fs.data[fs.idx]-'0')
		fs.idx++
	}
	return val
}

func main() {
	fs := NewFastScanner()
	n := fs.NextInt()

	g := make([][]Edge, n+1)
	for i := 0; i < n; i++ {
		a := fs.NextInt()
		b := fs.NextInt()
		t := int64(fs.NextInt())
		g[a] = append(g[a], Edge{b, t})
		g[b] = append(g[b], Edge{a, t})
	}

	deg := make([]int, n+1)
	for i := 1; i <= n; i++ {
		deg[i] = len(g[i])
	}

	removed := make([]bool, n+1)
	q := make([]int, 0, n)
	for i := 1; i <= n; i++ {
		if deg[i] == 1 {
			q = append(q, i)
		}
	}

	for head := 0; head < len(q); head++ {
		v := q[head]
		removed[v] = true
		for _, e := range g[v] {
			to := e.to
			if !removed[to] {
				deg[to]--
				if deg[to] == 1 {
					q = append(q, to)
				}
			}
		}
	}

	isCycle := make([]bool, n+1)
	k := 0
	start := 0
	for i := 1; i <= n; i++ {
		if !removed[i] {
			isCycle[i] = true
			k++
			if start == 0 {
				start = i
			}
		}
	}

	cycleNodes := make([]int, 0, k)
	cycleEdges := make([]int64, 0, k)
	prev := 0
	curr := start
	for len(cycleNodes) < k {
		cycleNodes = append(cycleNodes, curr)
		next := 0
		var w int64
		for _, e := range g[curr] {
			if isCycle[e.to] && e.to != prev {
				next = e.to
				w = e.w
				break
			}
		}
		cycleEdges = append(cycleEdges, w)
		prev, curr = curr, next
	}

	compID := make([]int, n+1)
	parent := make([]int, n+1)
	distRoot := make([]int64, n+1)
	subSize := make([]int64, n+1)
	down := make([]int64, n+1)
	treeAns := make([]int64, n+1)

	sz := make([]int64, k)
	rootSum := make([]int64, k)
	var totalRootSum int64

	for i, root := range cycleNodes {
		parent[root] = 0
		distRoot[root] = 0
		compID[root] = i

		stack := make([]int, 0)
		order := make([]int, 0)
		stack = append(stack, root)

		for len(stack) > 0 {
			v := stack[len(stack)-1]
			stack = stack[:len(stack)-1]
			order = append(order, v)

			for _, e := range g[v] {
				to := e.to
				if to == parent[v] || isCycle[to] {
					continue
				}
				parent[to] = v
				distRoot[to] = distRoot[v] + e.w
				compID[to] = i
				stack = append(stack, to)
			}
		}

		for idx := len(order) - 1; idx >= 0; idx-- {
			v := order[idx]
			subSize[v] = 1
			down[v] = 0
			for _, e := range g[v] {
				to := e.to
				if parent[to] == v {
					subSize[v] += subSize[to]
					down[v] += down[to] + subSize[to]*e.w
				}
			}
		}

		sz[i] = subSize[root]
		rootSum[i] = down[root]
		totalRootSum += rootSum[i]
		treeAns[root] = down[root]

		for _, v := range order {
			for _, e := range g[v] {
				to := e.to
				if parent[to] == v {
					treeAns[to] = treeAns[v] + (sz[i]-2*subSize[to])*e.w
				}
			}
		}
	}

	pos := make([]int64, k+1)
	for i := 0; i < k; i++ {
		pos[i+1] = pos[i] + cycleEdges[i]
	}
	L := pos[k]

	x := make([]int64, 2*k)
	wts := make([]int64, 2*k)
	for i := 0; i < k; i++ {
		x[i] = pos[i]
		x[i+k] = pos[i] + L
		wts[i] = sz[i]
		wts[i+k] = sz[i]
	}

	prefW := make([]int64, 2*k+1)
	prefWP := make([]int64, 2*k+1)
	for i := 0; i < 2*k; i++ {
		prefW[i+1] = prefW[i] + wts[i]
		prefWP[i+1] = prefWP[i] + wts[i]*x[i]
	}

	G := make([]int64, k)
	r := 0
	for i := 0; i < k; i++ {
		if r < i {
			r = i
		}
		for r+1 < i+k && 2*(x[r+1]-x[i]) <= L {
			r++
		}
		sumW1 := prefW[r+1] - prefW[i+1]
		sumWP1 := prefWP[r+1] - prefWP[i+1]
		cw := sumWP1 - x[i]*sumW1

		sumW2 := prefW[i+k] - prefW[r+1]
		sumWP2 := prefWP[i+k] - prefWP[r+1]
		ccw := (L+x[i])*sumW2 - sumWP2

		G[i] = cw + ccw
	}

	ans := make([]int64, n+1)
	N := int64(n)
	for v := 1; v <= n; v++ {
		i := compID[v]
		ans[v] = treeAns[v] + distRoot[v]*(N-sz[i]) + totalRootSum - rootSum[i] + G[i]
	}

	out := bufio.NewWriterSize(os.Stdout, 1<<20)
	for i := 1; i <= n; i++ {
		if i > 1 {
			out.WriteByte(' ')
		}
		out.WriteString(strconv.FormatInt(ans[i], 10))
	}
	out.WriteByte('\n')
	out.Flush()
}