← Home
```go
package main

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

type FastScanner struct {
	data []byte
	idx  int
}

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

func (fs *FastScanner) NextInt() int {
	for fs.idx < len(fs.data) && fs.data[fs.idx] <= ' ' {
		fs.idx++
	}
	sign := 1
	if fs.data[fs.idx] == '-' {
		sign = -1
		fs.idx++
	}
	v := 0
	for fs.idx < len(fs.data) {
		c := fs.data[fs.idx]
		if c < '0' || c > '9' {
			break
		}
		v = v*10 + int(c-'0')
		fs.idx++
	}
	return v * sign
}

type Edge struct {
	a int
	b int
	w int64
}

type Query struct {
	v int
	l int64
}

func main() {
	fs := NewFastScanner()
	n := fs.NextInt()
	m := fs.NextInt()

	const INF int64 = 1 << 60

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

	edges := make([]Edge, m)
	for i := 0; i < m; i++ {
		u := fs.NextInt() - 1
		v := fs.NextInt() - 1
		w := int64(fs.NextInt())
		edges[i] = Edge{u, v, w}
		dist[u*n+v] = w
		dist[v*n+u] = w
	}

	for k := 0; k < n; k++ {
		rowK := dist[k*n : k*n+n]
		for i := 0; i < n; i++ {
			rowI := dist[i*n : i*n+n]
			dik := rowI[k]
			if dik == INF {
				continue
			}
			for j := 0; j < n; j++ {
				nd := dik + rowK[j]
				if nd < rowI[j] {
					rowI[j] = nd
				}
			}
		}
	}

	q := fs.NextInt()
	queriesByU := make([][]Query, n)
	for i := 0; i < q; i++ {
		u := fs.NextInt() - 1
		v := fs.NextInt() - 1
		l := int64(fs.NextInt())
		queriesByU[u] = append(queriesByU[u], Query{v, l})
	}

	useful := make([]bool, m)
	ans := 0
	mx := make([]int64, n)

	for s := 0; s < n && ans < m; s++ {
		qs := queriesByU[s]
		if len(qs) == 0 {
			continue
		}

		for i := 0; i < n; i++ {
			mx[i] = -INF
		}

		for _, qq := range qs {
			rowV := dist[qq.v*n : qq.v*n+n]
			lim := qq.l
			for x := 0; x < n; x++ {
				val := lim - rowV[x]
				if val > mx[x] {
					mx[x] = val
				}
			}
		}

		rowS := dist[s*n : s*n+n]
		for i, e := range edges {
			if useful[i] {
				continue
			}
			if rowS[e.a]+e.w <= mx[e.b] || rowS[e.b]+e.w <= mx[e.a] {
				useful[i] = true
				ans++
			}
		}
	}

	out := bufio.NewWriterSize(os.Stdout, 32)
	out.WriteString(strconv.Itoa(ans))
	out.Flush()
}
```