```go
package main
import (
"bufio"
"fmt"
"os"
"sort"
"strconv"
"strings"
)
type Team struct {
Name string
Points int
Scored int
Missed int
}
func main() {
scanner := bufio.NewScanner(os.Stdin)
scanner.Split(bufio.ScanWords)
if !scanner.Scan() {
return
}
n, _ := strconv.Atoi(scanner.Text())
teams := make([]*Team, n)
teamMap := make(map[string]*Team)
for i := 0; i < n; i++ {
scanner.Scan()
name := scanner.Text()
t := &Team{Name: name}
teams[i] = t
teamMap[name] = t
}
numMatches := n * (n - 1) / 2
for i := 0; i < numMatches; i++ {
scanner.Scan()
namesToken := scanner.Text()
scanner.Scan()
scoresToken := scanner.Text()
dashIndex := strings.Index(namesToken, "-")
name1 := namesToken[:dashIndex]
name2 := namesToken[dashIndex+1:]
colonIndex := strings.Index(scoresToken, ":")
score1, _ := strconv.Atoi(scoresToken[:colonIndex])
score2, _ := strconv.Atoi(scoresToken[colonIndex+1:])
t1 := teamMap[name1]
t2 := teamMap[name2]
t1.Scored += score1
t1.Missed += score2
t2.Scored += score2
t2.Missed += score1
if score1 > score2 {
t1.Points += 3
} else if score2 > score1 {
t2.Points += 3
} else {
t1.Points += 1
t2.Points += 1
}
}
sort.Slice(teams, func(i, j int) bool {
if teams[i].Points != teams[j].Points {
return teams[i].Points > teams[j].Points
}
diff1 := teams[i].Scored - teams[i].Missed
diff2 := teams[j].Scored - teams[j].Missed
if diff1 != diff2 {
return diff1 > diff2
}
return teams[i].Scored > teams[j].Scored
})
result := make([]string, n/2)
for i := 0; i < n/2; i++ {
result[i] = teams[i].Name
}
sort.Strings(result)
for _, name := range result {
fmt.Println(name)
}
}
```