← Home
For problem statement at 0-999/0-99/50-59/59/problemE.txt this is a correct solution, but verifier at 0-999/0-99/50-59/59/verifierE.go ends with  can you fix the verifier? package main

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

func nextInt(data []byte, idx *int) int {
	n := len(data)
	i := *idx
	for i < n {
		c := data[i]
		if c >= '0' && c <= '9' {
			break
		}
		i++
	}
	val := 0
	for i < n {
		c := data[i]
		if c < '0' || c > '9' {
			break
		}
		val = val*10 + int(c-'0')
		i++
	}
	*idx = i
	return val
}

func main() {
	data, _ := io.ReadAll(os.Stdin)
	idx := 0

	n := nextInt(data, &idx)
	m := nextInt(data, &idx)
	k := nextInt(data, &idx)

	adj := make([][]int, n+1)
	prev := make([]int, 1, 2*m+1)
	curr := make([]int, 1, 2*m+1)
	curr[0] = 1

	mul := n + 1
	pairID := make(map[int]int, 2*m+1)

	for i := 0; i < m; i++ {
		u := nextInt(data, &idx)
		v := nextInt(data, &idx)

		id := len(prev)
		prev = append(prev, u)
		curr = append(curr, v)
		adj[u] = append(adj[u], id)
		pairID[u*mul+v] = id

		id = len(prev)
		prev = append(prev, v)
		curr = append(curr, u)
		adj[v] = append(adj[v], id)
		pairID[v*mul+u] = id
	}

	forb := make([][]int, len(prev))
	for i := 0; i < k; i++ {
		a := nextInt(data, &idx)
		b := nextInt(data, &idx)
		c := nextInt(data, &idx)
		if id, ok := pairID[a*mul+b]; ok {
			forb[id] = append(forb[id], c)
		}
	}

	for i := 1; i < len(forb); i++ {
		if len(forb[i]) > 1 {
			sort.Ints(forb[i])
		}
	}

	parent := make([]int, len(prev))
	for i := range parent {
		parent[i] = -2
	}
	parent[0] = -1

	queue := make([]int, 1, len(prev))
	queue[0] = 0
	end := -1

	for head := 0; head < len(queue); head++ {
		s := queue[head]
		if curr[s] == n {
			end = s
			break
		}

		fl := forb[s]
		b := curr[s]

		if len(fl) == 0 {
			for _, nid := range adj[b] {
				if parent[nid] == -2 {
					parent[nid] = s
					queue = append(queue, nid)
				}
			}
		} else if len(fl) <= 8 {
			for _, nid := range adj[b] {
				c := curr[nid]
				blocked := false
				for _, x := range fl {
					if x == c {
						blocked = true
						break
					}
				}
				if blocked {
					continue
				}
				if parent[nid] == -2 {
					parent[nid] = s
					queue = append(queue, nid)
				}
			}
		} else {
			for _, nid := range adj[b] {
				c := curr[nid]
				l, r := 0, len(fl)
				for l < r {
					mid := (l + r) >> 1
					if fl[mid] < c {
						l = mid + 1
					} else {
						r = mid
					}
				}
				if l < len(fl) && fl[l] == c {
					continue
				}
				if parent[nid] == -2 {
					parent[nid] = s
					queue = append(queue, nid)
				}
			}
		}
	}

	if end == -1 {
		os.Stdout.Write([]byte("-1\n"))
		return
	}

	chain := make([]int, 0)
	for s := end; s != -1; s = parent[s] {
		chain = append(chain, s)
	}

	out := make([]byte, 0, len(chain)*8)
	out = strconv.AppendInt(out, int64(len(chain)-1), 10)
	out = append(out, '\n')
	for i := len(chain) - 1; i >= 0; i-- {
		if i != len(chain)-1 {
			out = append(out, ' ')
		}
		out = strconv.AppendInt(out, int64(curr[chain[i]]), 10)
	}
	out = append(out, '\n')
	os.Stdout.Write(out)
}