← Home
package main

import (
	"io"
	"os"
	"strconv"
)

func main() {
	data, _ := io.ReadAll(os.Stdin)
	idx := 0
	nextInt := func() int {
		for idx < len(data) && (data[idx] < '0' || data[idx] > '9') {
			idx++
		}
		v := 0
		for idx < len(data) && data[idx] >= '0' && data[idx] <= '9' {
			v = v*10 + int(data[idx]-'0')
			idx++
		}
		return v
	}

	n := nextInt()
	t := nextInt()
	k := nextInt()

	a := make([]int, t+1)
	for i := 1; i <= t; i++ {
		a[i] = nextInt()
	}

	low, high := 0, 0
	capc := make([]int, t+1)
	for i := 1; i < t; i++ {
		low++
		if a[i] < a[i+1] {
			capc[i] = a[i]
		} else {
			capc[i] = a[i+1]
		}
		high += capc[i]
	}

	need := n - 1 - k
	if need < low || need > high {
		os.Stdout.Write([]byte("-1"))
		return
	}

	x := make([]int, t+1)
	for i := 1; i < t; i++ {
		x[i] = 1
	}
	extra := need - low
	for i := 1; i < t && extra > 0; i++ {
		add := capc[i] - 1
		if add > extra {
			add = extra
		}
		x[i] += add
		extra -= add
	}

	levels := make([][]int, t+1)
	id := 2
	for i := 1; i <= t; i++ {
		levels[i] = make([]int, a[i])
		for j := 0; j < a[i]; j++ {
			levels[i][j] = id
			id++
		}
	}

	out := make([]byte, 0, (n+1)*16)
	out = strconv.AppendInt(out, int64(n), 10)
	out = append(out, '\n')

	addEdge := func(u, v int) {
		out = strconv.AppendInt(out, int64(u), 10)
		out = append(out, ' ')
		out = strconv.AppendInt(out, int64(v), 10)
		out = append(out, '\n')
	}

	for _, v := range levels[1] {
		addEdge(1, v)
	}
	for i := 1; i < t; i++ {
		parents := levels[i][:x[i]]
		children := levels[i+1]
		for j := 0; j < x[i]; j++ {
			addEdge(parents[j], children[j])
		}
		for j := x[i]; j < len(children); j++ {
			addEdge(parents[0], children[j])
		}
	}

	os.Stdout.Write(out)
}