← Home
```go
package main

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

// Global variables to reduce allocation overhead
var (
	sortCosts   []int
	sortIndices []int
	edges       []Edge
)

type Edge struct {
	u, v, w, id int
}

type QueryInterval struct {
	limit int
	A, B  int64
}

type DSU struct {
	parent []int
}

func NewDSU(n int) *DSU {
	p := make([]int, n+1)
	for i := range p {
		p[i] = i
	}
	return &DSU{parent: p}
}

func (d *DSU) Find(i int) int {
	if d.parent[i] != i {
		d.parent[i] = d.Find(d.parent[i])
	}
	return d.parent[i]
}

func (d *DSU) Union(i, j int) bool {
	rootI := d.Find(i)
	rootJ := d.Find(j)
	if rootI != rootJ {
		d.parent[rootI] = rootJ
		return true
	}
	return false
}

func (d *DSU) Reset() {
	for i := range d.parent {
		d.parent[i] = i
	}
}

// Implement sort.Interface
type byCost struct{}

func (byCost) Len() int { return len(sortIndices) }
func (byCost) Swap(i, j int) {
	sortIndices[i], sortIndices[j] = sortIndices[j], sortIndices[i]
}
func (byCost) Less(i, j int) bool {
	c1 := sortCosts[sortIndices[i]]
	c2 := sortCosts[sortIndices[j]]
	if c1 != c2 {
		return c1 < c2
	}
	return sortIndices[i] < sortIndices[j]
}

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

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

	edges = make([]Edge, m)
	for i := 0; i < m; i++ {
		fmt.Fscan(reader, &edges[i].u, &edges[i].v, &edges[i].w)
		edges[i].id = i
	}

	pointSet := make(map[int]struct{})
	for i := 0; i < m; i++ {
		pointSet[edges[i].w] = struct{}{}
		for j := i + 1; j < m; j++ {
			mid := (edges[i].w + edges[j].w) / 2
			pointSet[mid] = struct{}{}
		}
	}

	points := make([]int, 0, len(pointSet))
	for p := range pointSet {
		if p >= 0 {
			points = append(points, p)
		}
	}
	sort.Ints(points)

	sortCosts = make([]int, m)
	sortIndices = make([]int, m)
	intervals := make([]QueryInterval, 0, len(points)+1)
	dsu := NewDSU(n)
	prevLim := -1

	process := func(limit int) {
		L := prevLim + 1
		R := limit
		if L > R {
			return
		}

		for i := 0; i < m; i++ {
			c := edges[i].w - L
			if c < 0 {
				c = -c
			}
			sortCosts[i] = c
			sortIndices[i] = i
		}

		sort.Sort(byCost{})

		dsu.Reset()
		var sumA, sumB int64
		
		for _, idx := range sortIndices {
			e := edges[idx]
			if dsu.Union(e.u, e.v) {
				if e.w >= L {
					sumA -= 1
					sumB += int64(e.w)
				} else {
					sumA += 1
					sumB -= int64(e.w)
				}
			}
		}
		intervals = append(intervals, QueryInterval{limit: R, A: sumA, B: sumB})
	}

	for _, p := range points {
		process(p)
		prevLim = p
	}
	process(200000000)

	var p, k int
	var a, b, c int64
	fmt.Fscan(reader, &p, &k, &a, &b, &c)

	qs := make([]int64, p)
	for i := 0; i < p; i++ {
		fmt.Fscan(reader, &qs[i])
	}

	var totalXor int64
	var lastQ int64
	nIntervals := len(intervals)

	for i := 0; i < k; i++ {
		var q int64
		if i < p {
			q = qs[i]
		} else {
			q = (lastQ*a + b) % c
		}
		lastQ = q

		l, r := 0, nIntervals-1
		idx := nIntervals - 1
		qInt := int(q)
		
		for l <= r {
			mid := (l + r) >> 1
			if intervals[mid].limit >= qInt {
				idx = mid
				r = mid - 1
			} else {
				l = mid + 1
			}
		}
		
		inter := intervals[idx]
		ans := inter.A*q + inter.B
		totalXor ^= ans
	}

	fmt.Fprintln(writer, totalXor)
}
```