← Home
```go
package main

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

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 {
	i := fs.idx
	for i < fs.n && (fs.data[i] < '0' || fs.data[i] > '9') {
		i++
	}
	val := 0
	for i < fs.n && fs.data[i] >= '0' && fs.data[i] <= '9' {
		val = val*10 + int(fs.data[i]-'0')
		i++
	}
	fs.idx = i
	return val
}

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

	t := fs.NextInt()
	for ; t > 0; t-- {
		n := fs.NextInt()
		m := fs.NextInt()

		a := make([]int, n)
		for i := 0; i < n; i++ {
			a[i] = fs.NextInt()
		}

		b := make([]int, m+1)
		indeg := make([]int, m+1)
		head := make([]int, m+1)
		nextEdge := make([]int, m+1)

		for i := 1; i <= m; i++ {
			v := fs.NextInt()
			b[i] = v
			indeg[v]++
			nextEdge[i] = head[v]
			head[v] = i
		}

		queue := make([]int, m)
		qh, qt := 0, 0
		for i := 1; i <= m; i++ {
			if indeg[i] == 0 {
				queue[qt] = i
				qt++
			}
		}
		for qh < qt {
			u := queue[qh]
			qh++
			v := b[u]
			indeg[v]--
			if indeg[v] == 0 {
				queue[qt] = v
				qt++
			}
		}

		inCycle := make([]bool, m+1)
		for i := 1; i <= m; i++ {
			if indeg[i] > 0 {
				inCycle[i] = true
			}
		}

		comp := make([]int, m+1)
		depth := make([]int, m+1)
		root := make([]int, m+1)
		pos := make([]int, m+1)
		tin := make([]int, m+1)
		tout := make([]int, m+1)
		cycleLen := make([]int, 1, m+1)

		stackNode := queue
		stackEdge := indeg
		compCnt := 0
		timer := 0

		for i := 1; i <= m; i++ {
			if !inCycle[i] || comp[i] != 0 {
				continue
			}

			compCnt++

			clen := 1
			cur := b[i]
			for cur != i {
				clen++
				cur = b[cur]
			}
			cycleLen = append(cycleLen, clen)

			cur = i
			p := 0
			for {
				comp[cur] = compCnt
				root[cur] = cur
				pos[cur] = p
				p++
				cur = b[cur]
				if cur == i {
					break
				}
			}

			cur = i
			for {
				c := cur
				timer++
				tin[c] = timer

				top := 1
				stackNode[0] = c
				stackEdge[0] = head[c]

				for top > 0 {
					u := stackNode[top-1]
					e := stackEdge[top-1]

					for e != 0 && inCycle[e] {
						e = nextEdge[e]
					}

					if e == 0 {
						tout[u] = timer
						top--
						continue
					}

					stackEdge[top-1] = nextEdge[e]
					v := e
					comp[v] = comp[u]
					root[v] = root[u]
					depth[v] = depth[u] + 1
					timer++
					tin[v] = timer
					stackNode[top] = v
					stackEdge[top] = head[v]
					top++
				}

				cur = b[cur]
				if cur == i {
					break
				}
			}
		}

		check := func(K int) bool {
			ptr := 0
			for y := 1; y <= m && ptr < n; y++ {
				cyComp := comp[y]

				if inCycle[y] {
					py := pos[y]
					clen := cycleLen[cyComp]
					for ptr < n {
						x := a[ptr]
						if comp[x] != cyComp {
							break
						}
						d := depth[x]
						diff := py - pos[root[x]]
						if diff < 0 {
							diff += clen
						}
						d += diff
						if d > K {
							break
						}
						ptr++
					}
				} else {
					ry := root[y]
					dy := depth[y]
					ly := tin[y]
					ry2 := tout[y]
					for ptr < n {
						x := a[ptr]
						if comp[x] != cyComp || root[x] != ry || depth[x] < dy {
							break
						}
						tx := tin[x]
						if tx < ly || tx > ry2 {
							break
						}
						if depth[x]-dy > K {
							break
						}
						ptr++
					}
				}
			}
			return ptr == n
		}

		ans := -1
		if check(m - 1) {
			l, r := 0, m-1
			for l < r {
				mid := (l + r) >> 1
				if check(mid) {
					r = mid
				} else {
					l = mid + 1
				}
			}
			ans = l
		}

		out.WriteString(strconv.Itoa(ans))
		out.WriteByte('\n')
	}
}
```