← Home
```go
package main

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

const INF int64 = 2e18

type Edge struct {
	to     int
	weight 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{}) {
	item := x.(*Item)
	*pq = append(*pq, item)
}

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

func main() {
	reader := bufio.NewReader(os.Stdin)
	writer := bufio.NewWriter(os.Stdout)
	defer writer.Flush()

	var n, m int
	fmt.Fscan(reader, &n, &m)

	adj := make([][]Edge, n+1)
	for i := 0; i < m; i++ {
		var u, v int
		var y int64
		fmt.Fscan(reader, &u, &v, &y)
		adj[u] = append(adj[u], Edge{to: v, weight: y})
		adj[v] = append(adj[v], Edge{to: u, weight: y})
	}

	dist := make([]int64, n+1)
	for i := 1; i <= n; i++ {
		dist[i] = INF
	}

	pq := &PriorityQueue{}
	heap.Init(pq)

	dist[1] = 0
	heap.Push(pq, &Item{node: 1, dist: 0})

	for pq.Len() > 0 {
		item := heap.Pop(pq).(*Item)
		u := item.node
		d := item.dist

		if d > dist[u] {
			continue
		}

		for _, e := range adj[u] {
			if dist[u]+e.weight < dist[e.to] {
				dist[e.to] = dist[u] + e.weight
				heap.Push(pq, &Item{node: e.to, dist: dist[e.to]})
			}
		}
	}

	if dist[n] == INF {
		fmt.Fprintln(writer, "inf")
		return
	}

	distSet := make(map[int64]bool)
	for i := 1; i <= n; i++ {
		if dist[i] <= dist[n] {
			distSet[dist[i]] = true
		}
	}

	sortedDists := make([]int64, 0, len(distSet))
	for d := range distSet {
		sortedDists = append(sortedDists, d)
	}
	sort.Slice(sortedDists, func(i, j int) bool { return sortedDists[i] < sortedDists[j] })

	type Game struct {
		mask string
		time int64
	}
	var games []Game

	for i := 0; i < len(sortedDists)-1; i++ {
		d1 := sortedDists[i]
		d2 := sortedDists[i+1]
		if d2 > d1 {
			time := d2 - d1
			maskBytes := make([]byte, n)
			for j := 1; j <= n; j++ {
				if dist[j] <= d1 {
					maskBytes[j-1] = '1'
				} else {
					maskBytes[j-1] = '0'
				}
			}
			games = append(games, Game{string(maskBytes), time})
		}
	}

	fmt.Fprintln(writer, dist[n], len(games))
	for _, g := range games {
		fmt.Fprintln(writer, g.mask, g.time)
	}
}
```