← Home
package main

import (
	"bufio"
	"fmt"
	"os"
)

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

	var n, m int
	if _, err := fmt.Fscan(in, &n, &m); err != nil {
		return
	}

	colorEdges := make([][][2]int, m+1)
	for i := 0; i < m; i++ {
		var u, v, c int
		fmt.Fscan(in, &u, &v, &c)
		colorEdges[c] = append(colorEdges[c], [2]int{u, v})
	}

	compIDs := make([][]int, n+1)
	parent := make([]int, n+1)
	seen := make([]int, n+1)
	seenID := make([]int, n+1)
	id := make([]int, n+1)
	gen := 0
	compCount := 0

	for c := 1; c <= m; c++ {
		if len(colorEdges[c]) == 0 {
			continue
		}
		gen++
		var nodes []int
		for _, e := range colorEdges[c] {
			u, v := e[0], e[1]
			if seen[u] != gen {
				seen[u] = gen
				parent[u] = u
				nodes = append(nodes, u)
			}
			if seen[v] != gen {
				seen[v] = gen
				parent[v] = v
				nodes = append(nodes, v)
			}
			pu := u
			for parent[pu] != pu {
				parent[pu] = parent[parent[pu]]
				pu = parent[pu]
			}
			pv := v
			for parent[pv] != pv {
				parent[pv] = parent[parent[pv]]
				pv = parent[pv]
			}
			if pu != pv {
				parent[pu] = pv
			}
		}

		for _, v := range nodes {
			root := v
			for parent[root] != root {
				parent[root] = parent[parent[root]]
				root = parent[root]
			}
			if seenID[root] != gen {
				compCount++
				seenID[root] = gen
				id[root] = compCount
			}
			compIDs[v] = append(compIDs[v], id[root])
		}
	}

	var q int
	fmt.Fscan(in, &q)
	memo := make(map[int64]int)

	for k := 0; k < q; k++ {
		var u, v int
		fmt.Fscan(in, &u, &v)

		if u > v {
			u, v = v, u
		}
		key := int64(u)<<32 | int64(v)
		if ans, ok := memo[key]; ok {
			fmt.Fprintln(out, ans)
			continue
		}

		listU := compIDs[u]
		listV := compIDs[v]

		ans := 0
		i, j := 0, 0
		for i < len(listU) && j < len(listV) {
			if listU[i] == listV[j] {
				ans++
				i++
				j++
			} else if listU[i] < listV[j] {
				i++
			} else {
				j++
			}
		}
		memo[key] = ans
		fmt.Fprintln(out, ans)
	}
}