← Home
```go
package main

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

func main() {
	in := bufio.NewReader(os.Stdin)
	var n, m, k int
	fmt.Fscan(in, &n, &m, &k)
	marked := make([]int, k)
	for i := 0; i < k; i++ {
		fmt.Fscan(in, &marked[i])
	}
	if m < n-1 {
		fmt.Println(-1)
		return
	}
	t := n - k
	if t == 0 {
		fmt.Println(-1)
		return
	}
	// collect unmarked
	unmarked := []int{}
	isMarked := make([]bool, n+1)
	for _, a := range marked {
		isMarked[a] = true
	}
	for i := 1; i <= n; i++ {
		if !isMarked[i] {
			unmarked = append(unmarked, i)
		}
	}
	// choose isolated: first marked
	isolated := marked[0]
	// s_prime: the rest
	sPrime := []int{}
	for i := 1; i < k; i++ {
		sPrime = append(sPrime, marked[i])
	}
	// s_prime set for fast check
	sPrimeSet := make(map[int]bool)
	for _, s := range sPrime {
		sPrimeSet[s] = true
	}
	// choose u: first unmarked
	u := unmarked[0]
	// tree edges
	treeEdges := [][]int{}
	for v := 1; v <= n; v++ {
		if v != u {
			a, b := u, v
			if a > b {
				a, b = b, a
			}
			treeEdges = append(treeEdges, []int{a, b})
		}
	}
	// now candidates
	candidates := [][]int{}
	for i := 1; i <= n; i++ {
		for j := i + 1; j <= n; j++ {
			// check forbidden
			var forbidden bool
			if (i == isolated && sPrimeSet[j]) || (j == isolated && sPrimeSet[i]) {
				forbidden = true
			}
			if forbidden {
				continue
			}
			// check if tree edge: one is u, other not u
			isTree := ((i == u && j != u) || (j == u && i != u))
			if isTree {
				continue
			}
			candidates = append(candidates, []int{i, j})
		}
	}
	// now len(candidates)
	maxExtra := len(candidates)
	if m-(n-1) > maxExtra {
		fmt.Println(-1)
		return
	}
	extraNeeded := m - (n - 1)
	// now build all edges: tree + first extraNeeded candidates
	allEdges := [][]int{}
	allEdges = append(allEdges, treeEdges...)
	for i := 0; i < extraNeeded; i++ {
		ed := candidates[i]
		allEdges = append(allEdges, []int{ed[0], ed[1]})
	}
	// now output
	for _, ed := range allEdges {
		fmt.Println(ed[0], ed[1])
	}
}
```