← Home
package main

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

type FastScanner struct {
	data []byte
	idx  int
}

func NewFastScanner() *FastScanner {
	data, _ := io.ReadAll(os.Stdin)
	return &FastScanner{data: data}
}

func (fs *FastScanner) NextInt64() int64 {
	n := len(fs.data)
	for fs.idx < n && fs.data[fs.idx] <= ' ' {
		fs.idx++
	}
	var sign int64 = 1
	if fs.idx < n && fs.data[fs.idx] == '-' {
		sign = -1
		fs.idx++
	}
	var val int64
	for fs.idx < n {
		b := fs.data[fs.idx]
		if b < '0' || b > '9' {
			break
		}
		val = val*10 + int64(b-'0')
		fs.idx++
	}
	return val * sign
}

type Edge struct {
	to   int
	cost int64
}

type Item struct {
	d   int64
	c   int64
	idx int
}

type PQ []Item

func (pq PQ) Len() int { return len(pq) }

func (pq PQ) Less(i, j int) bool {
	if pq[i].d != pq[j].d {
		return pq[i].d < pq[j].d
	}
	if pq[i].c != pq[j].c {
		return pq[i].c > pq[j].c
	}
	return pq[i].idx < pq[j].idx
}

func (pq PQ) Swap(i, j int) { pq[i], pq[j] = pq[j], pq[i] }

func (pq *PQ) Push(x any) {
	*pq = append(*pq, x.(Item))
}

func (pq *PQ) Pop() any {
	old := *pq
	n := len(old)
	x := old[n-1]
	*pq = old[:n-1]
	return x
}

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

	t := int(in.NextInt64())
	const INF int64 = 1 << 62

	for ; t > 0; t-- {
		n := int(in.NextInt64())
		m := int(in.NextInt64())
		p := in.NextInt64()

		w := make([]int64, n)
		for i := 0; i < n; i++ {
			w[i] = in.NextInt64()
		}

		vals := append([]int64(nil), w...)
		sort.Slice(vals, func(i, j int) bool { return vals[i] < vals[j] })
		uniq := vals[:0]
		for _, x := range vals {
			if len(uniq) == 0 || uniq[len(uniq)-1] != x {
				uniq = append(uniq, x)
			}
		}

		rankMap := make(map[int64]int, len(uniq))
		for i, x := range uniq {
			rankMap[x] = i
		}
		rank := make([]int, n)
		for i := 0; i < n; i++ {
			rank[i] = rankMap[w[i]]
		}

		adj := make([][]Edge, n)
		for i := 0; i < m; i++ {
			a := int(in.NextInt64()) - 1
			b := int(in.NextInt64()) - 1
			s := in.NextInt64()
			adj[a] = append(adj[a], Edge{to: b, cost: s})
		}

		k := len(uniq)
		size := n * k
		dist := make([]int64, size)
		coins := make([]int64, size)
		for i := 0; i < size; i++ {
			dist[i] = INF
			coins[i] = -1
		}

		startH := rank[0]
		startIdx := startH
		dist[startIdx] = 0
		coins[startIdx] = p

		pq := &PQ{{d: 0, c: p, idx: startIdx}}
		heap.Init(pq)

		ans := int64(-1)

		for pq.Len() > 0 {
			it := heap.Pop(pq).(Item)
			if it.d != dist[it.idx] || it.c != coins[it.idx] {
				continue
			}

			u := it.idx / k
			h := it.idx % k

			if u == n-1 {
				ans = it.d
				break
			}

			rate := uniq[h]
			for _, e := range adj[u] {
				add := int64(0)
				if it.c < e.cost {
					add = (e.cost - it.c + rate - 1) / rate
				}
				nd := it.d + add
				nc := it.c + add*rate - e.cost
				nh := h
				if rank[e.to] > nh {
					nh = rank[e.to]
				}
				nidx := e.to*k + nh
				if nd < dist[nidx] || (nd == dist[nidx] && nc > coins[nidx]) {
					dist[nidx] = nd
					coins[nidx] = nc
					heap.Push(pq, Item{d: nd, c: nc, idx: nidx})
				}
			}
		}

		fmt.Fprintln(out, ans)
	}
}