```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])
}
}
```