package main

import (
	"bufio"
	"container/heap"
	"fmt"
	"os"
)

type FastScanner struct {
	r   *bufio.Reader
	buf []byte
	i   int
	n   int
}

func NewFastScanner() *FastScanner {
	return &FastScanner{
		r:   bufio.NewReaderSize(os.Stdin, 1<<20),
		buf: make([]byte, 1<<20),
	}
}

func (fs *FastScanner) readByte() byte {
	if fs.i >= fs.n {
		fs.n, _ = fs.r.Read(fs.buf)
		fs.i = 0
		if fs.n == 0 {
			return 0
		}
	}
	b := fs.buf[fs.i]
	fs.i++
	return b
}

func (fs *FastScanner) NextInt() int {
	sign := 1
	b := fs.readByte()
	for b <= ' ' {
		if b == 0 {
			return 0
		}
		b = fs.readByte()
	}
	if b == '-' {
		sign = -1
		b = fs.readByte()
	}
	val := 0
	for b >= '0' && b <= '9' {
		val = val*10 + int(b-'0')
		b = fs.readByte()
	}
	return sign * val
}

type Edge struct {
	to int
	w  int64
}

type Item struct {
	node int
	dist int64
}

type PriorityQueue []Item

func (pq PriorityQueue) Len() int           { return len(pq) }
func (pq PriorityQueue) Less(i, j int) bool { return pq[i].dist < pq[j].dist }
func (pq PriorityQueue) Swap(i, j int)      { pq[i], pq[j] = pq[j], pq[i] }

func (pq *PriorityQueue) Push(x interface{}) {
	*pq = append(*pq, x.(Item))
}

func (pq *PriorityQueue) Pop() interface{} {
	old := *pq
	x := old[len(old)-1]
	*pq = old[:len(old)-1]
	return x
}

const INF int64 = 1 << 60

func dijkstra(n int, g [][]Edge, src int) []int64 {
	dist := make([]int64, n+1)
	for i := 1; i <= n; i++ {
		dist[i] = INF
	}
	dist[src] = 0

	pq := &PriorityQueue{}
	heap.Init(pq)
	heap.Push(pq, Item{node: src, dist: 0})

	for pq.Len() > 0 {
		cur := heap.Pop(pq).(Item)
		u := cur.node
		if cur.dist != dist[u] {
			continue
		}
		for _, e := range g[u] {
			nd := cur.dist + e.w
			if nd < dist[e.to] {
				dist[e.to] = nd
				heap.Push(pq, Item{node: e.to, dist: nd})
			}
		}
	}
	return dist
}

func main() {
	in := NewFastScanner()
	out := bufio.NewWriterSize(os.Stdout, 1<<20)
	defer out.Flush()

	n := in.NextInt()
	m := in.NextInt()

	g := make([][]Edge, n+1)
	rg := make([][]Edge, n+1) // 反图

	for i := 0; i < m; i++ {
		u := in.NextInt()
		v := in.NextInt()
		w := int64(in.NextInt())
		g[u] = append(g[u], Edge{to: v, w: w})
		rg[v] = append(rg[v], Edge{to: u, w: w})
	}

	dist1 := dijkstra(n, g, 1)  // 1 -> i
	dist2 := dijkstra(n, rg, 1) // i -> 1(反图 1 -> i)

	var ans int64 = 0
	for i := 2; i <= n; i++ {
		if dist1[i] >= INF/2 || dist2[i] >= INF/2 {
			fmt.Fprintln(out, -1)
			return
		}
		ans += dist1[i] + dist2[i]
	}
	fmt.Fprintln(out, ans)
}