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
}
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)
}
}
isolated := marked[0]
sPrime := []int{}
for i := 1; i < k; i++ {
sPrime = append(sPrime, marked[i])
}
sPrimeSet := make(map[int]bool)
for _, s := range sPrime {
sPrimeSet[s] = true
}
u := unmarked[0]
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})
}
}
candidates := [][]int{}
for i := 1; i <= n; i++ {
for j := i + 1; j <= n; j++ {
var forbidden bool
if (i == isolated && sPrimeSet[j]) || (j == isolated && sPrimeSet[i]) {
forbidden = true
}
if forbidden {
continue
}
isTree := ((i == u && j != u) || (j == u && i != u))
if isTree {
continue
}
candidates = append(candidates, []int{i, j})
}
}
maxExtra := len(candidates)
if m-(n-1) > maxExtra {
fmt.Println(-1)
return
}
extraNeeded := m - (n - 1)
allEdges := [][]int{}
allEdges = append(allEdges, treeEdges...)
for i := 0; i < extraNeeded; i++ {
ed := candidates[i]
allEdges = append(allEdges, []int{ed[0], ed[1]})
}
for _, ed := range allEdges {
fmt.Println(ed[0], ed[1])
}
}