```go
package main
import (
"bufio"
"fmt"
"os"
)
func main() {
in := bufio.NewReader(os.Stdin)
out := bufio.NewWriter(os.Stdout)
defer out.Flush()
var n int
fmt.Fscan(in, &n)
a := make([]int, n)
for i := 0; i < n; i++ {
fmt.Fscan(in, &a[i])
}
if a[0] == 0 && n > 1 {
fmt.Fprintln(out, -1)
return
}
type pair struct {
f, t int
}
var res []pair
rem := make([]int, n)
copy(rem, a)
queue := make([]int, 0)
if rem[0] > 0 {
queue = append(queue, 1)
}
next := 2
for next <= n {
if len(queue) == 0 {
fmt.Fprintln(out, -1)
return
}
sender := queue[0]
if rem[sender-1] == 0 {
queue = queue[1:]
continue
}
receiver := next
res = append(res, pair{sender, receiver})
rem[sender-1]--
if rem[receiver-1] > 0 {
queue = append(queue, receiver)
}
next++
if rem[sender-1] == 0 {
queue = queue[1:]
}
}
fmt.Fprintln(out, len(res))
for _, p := range res {
fmt.Fprintln(out, p.f, p.t)
}
}
```