← Home
package main

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

func main() {
	in := bufio.NewReaderSize(os.Stdin, 1<<20)
	out := bufio.NewWriter(os.Stdout)
	defer out.Flush()

	var n, m, h int
	fmt.Fscan(in, &n, &m, &h)

	uArr := make([]int, n+1)
	for i := 1; i <= n; i++ {
		fmt.Fscan(in, &uArr[i])
	}

	adj := make([][]int, n+1)
	for i := 0; i < m; i++ {
		var c1, c2 int
		fmt.Fscan(in, &c1, &c2)
		if (uArr[c1]+1)%h == uArr[c2] {
			adj[c1] = append(adj[c1], c2)
		}
		if (uArr[c2]+1)%h == uArr[c1] {
			adj[c2] = append(adj[c2], c1)
		}
	}

	dfn := make([]int, n+1)
	low := make([]int, n+1)
	scc := make([]int, n+1)
	inStack := make([]bool, n+1)
	stack := make([]int, 0)
	timer := 0
	sccCnt := 0
	sccSize := make([]int, n+1)

	var dfs func(int)
	dfs = func(u int) {
		timer++
		dfn[u] = timer
		low[u] = timer
		stack = append(stack, u)
		inStack[u] = true

		for _, v := range adj[u] {
			if dfn[v] == 0 {
				dfs(v)
				if low[v] < low[u] {
					low[u] = low[v]
				}
			} else if inStack[v] {
				if dfn[v] < low[u] {
					low[u] = dfn[v]
				}
			}
		}

		if low[u] == dfn[u] {
			sccCnt++
			for {
				v := stack[len(stack)-1]
				stack = stack[:len(stack)-1]
				inStack[v] = false
				scc[v] = sccCnt
				sccSize[sccCnt]++
				if u == v {
					break
				}
			}
		}
	}

	for i := 1; i <= n; i++ {
		if dfn[i] == 0 {
			dfs(i)
		}
	}

	outDeg := make([]int, sccCnt+1)
	for i := 1; i <= n; i++ {
		for _, v := range adj[i] {
			if scc[i] != scc[v] {
				outDeg[scc[i]]++
			}
		}
	}

	bestScc := -1
	minS := n + 1
	for c := 1; c <= sccCnt; c++ {
		if outDeg[c] == 0 && sccSize[c] < minS {
			minS = sccSize[c]
			bestScc = c
		}
	}

	fmt.Fprintln(out, minS)
	first := true
	for i := 1; i <= n; i++ {
		if scc[i] == bestScc {
			if !first {
				fmt.Fprint(out, " ")
			}
			fmt.Fprint(out, i)
			first = false
		}
	}
	fmt.Fprintln(out)
}