← Home
package main

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

type MinHeap struct {
	a    []int32
	pos  []int32
	dist []int64
}

func (h *MinHeap) Len() int {
	return len(h.a) - 1
}

func (h *MinHeap) up(i int32) {
	for i > 1 {
		p := i >> 1
		if h.dist[h.a[p]] <= h.dist[h.a[i]] {
			break
		}
		h.a[p], h.a[i] = h.a[i], h.a[p]
		h.pos[h.a[p]] = p
		h.pos[h.a[i]] = i
		i = p
	}
}

func (h *MinHeap) down(i int32) {
	n := int32(len(h.a) - 1)
	for {
		l := i << 1
		if l > n {
			break
		}
		j := l
		r := l + 1
		if r <= n && h.dist[h.a[r]] < h.dist[h.a[l]] {
			j = r
		}
		if h.dist[h.a[i]] <= h.dist[h.a[j]] {
			break
		}
		h.a[i], h.a[j] = h.a[j], h.a[i]
		h.pos[h.a[i]] = i
		h.pos[h.a[j]] = j
		i = j
	}
}

func (h *MinHeap) Push(s int32) {
	h.a = append(h.a, s)
	i := int32(len(h.a) - 1)
	h.pos[s] = i
	h.up(i)
}

func (h *MinHeap) Decrease(s int32) {
	h.up(h.pos[s])
}

func (h *MinHeap) Pop() int32 {
	root := h.a[1]
	last := h.a[len(h.a)-1]
	h.a = h.a[:len(h.a)-1]
	if len(h.a) == 1 {
		h.pos[root] = -1
		return root
	}
	h.a[1] = last
	h.pos[last] = 1
	h.pos[root] = -1
	h.down(1)
	return root
}

func main() {
	data, _ := io.ReadAll(os.Stdin)
	p := 0
	nextInt := func() int {
		for p < len(data) && (data[p] < '0' || data[p] > '9') {
			p++
		}
		v := 0
		for p < len(data) && data[p] >= '0' && data[p] <= '9' {
			v = v*10 + int(data[p]-'0')
			p++
		}
		return v
	}

	n := nextInt()
	m := nextInt()

	head := make([]int32, n)
	for i := 0; i < n; i++ {
		head[i] = -1
	}
	to := make([]int32, 2*m)
	nxt := make([]int32, 2*m)
	wt := make([]uint8, 2*m)
	ec := 0
	addEdge := func(u, v, w int) {
		to[ec] = int32(v)
		wt[ec] = uint8(w)
		nxt[ec] = head[u]
		head[u] = int32(ec)
		ec++
	}

	for i := 0; i < m; i++ {
		u := nextInt() - 1
		v := nextInt() - 1
		w := nextInt()
		addEdge(u, v, w)
		addEdge(v, u, w)
	}

	const Layers int32 = 51
	states := n * int(Layers)
	const INF int64 = 1 << 60

	dist := make([]int64, states)
	for i := 0; i < states; i++ {
		dist[i] = INF
	}
	pos := make([]int32, states)

	h := MinHeap{
		a:    make([]int32, 1, states+1),
		pos:  pos,
		dist: dist,
	}

	var sq [101]int64
	for i := 0; i <= 100; i++ {
		sq[i] = int64(i * i)
	}

	dist[0] = 0
	h.Push(0)

	for h.Len() > 0 {
		s := h.Pop()
		d := dist[s]
		v := int(s / Layers)
		last := int(s % Layers)

		if last == 0 {
			for e := head[v]; e != -1; e = nxt[e] {
				ns := to[e]*Layers + int32(wt[e])
				if d < dist[ns] {
					pp := pos[ns]
					if pp == 0 {
						dist[ns] = d
						h.Push(ns)
					} else if pp > 0 {
						dist[ns] = d
						h.Decrease(ns)
					}
				}
			}
		} else {
			for e := head[v]; e != -1; e = nxt[e] {
				nd := d + sq[last+int(wt[e])]
				ns := to[e] * Layers
				if nd < dist[ns] {
					pp := pos[ns]
					if pp == 0 {
						dist[ns] = nd
						h.Push(ns)
					} else if pp > 0 {
						dist[ns] = nd
						h.Decrease(ns)
					}
				}
			}
		}
	}

	out := make([]byte, 0, n*12)
	for i := 0; i < n; i++ {
		if i > 0 {
			out = append(out, ' ')
		}
		d := dist[i*int(Layers)]
		if d == INF {
			out = append(out, '-', '1')
		} else {
			out = strconv.AppendInt(out, d, 10)
		}
	}
	out = append(out, '\n')
	os.Stdout.Write(out)
}