← Home
```go
package main

import (
	"bufio"
	"os"
	"sort"
	"strconv"
)

func main() {
	scanner := bufio.NewScanner(os.Stdin)
	scanner.Split(bufio.ScanWords)

	if !scanner.Scan() {
		return
	}
	n, _ := strconv.Atoi(scanner.Text())

	cities := make([]string, n)
	sumLen := 0
	for i := 0; i < n; i++ {
		scanner.Scan()
		cities[i] = scanner.Text()
		sumLen += len(cities[i])
	}

	scanner.Scan()
	dStr := scanner.Text()

	K := (2 * sumLen) / n

	groups := make(map[int][]string)
	for _, city := range cities {
		l := len(city)
		groups[l] = append(groups[l], city)
	}

	for _, g := range groups {
		sort.Strings(g)
	}

	var lines []string

	for x := 1; x <= K/2; x++ {
		y := K - x
		if x < y {
			U := groups[x]
			V := groups[y]
			for i := 0; i < len(U); i++ {
				s1 := U[i] + dStr + V[i]
				s2 := V[i] + dStr + U[i]
				if s1 < s2 {
					lines = append(lines, s1)
				} else {
					lines = append(lines, s2)
				}
			}
		} else if x == y {
			U := groups[x]
			for i := 0; i < len(U)/2; i++ {
				s1 := U[2*i] + dStr + U[2*i+1]
				s2 := U[2*i+1] + dStr + U[2*i]
				if s1 < s2 {
					lines = append(lines, s1)
				} else {
					lines = append(lines, s2)
				}
			}
		}
	}

	sort.Strings(lines)
	writer := bufio.NewWriter(os.Stdout)
	for _, line := range lines {
		writer.WriteString(line + "\n")
	}
	writer.Flush()
}
```