package main
import (
"bufio"
"fmt"
"os"
"sort"
"strconv"
)
type Participant struct {
name string
score int
}
func main() {
scanner := bufio.NewScanner(os.Stdin)
scanner.Split(bufio.ScanWords)
if !scanner.Scan() {
return
}
n, _ := strconv.Atoi(scanner.Text())
scanner.Scan()
m, _ := strconv.Atoi(scanner.Text())
regions := make([][]Participant, m+1)
for i := 0; i < n; i++ {
scanner.Scan()
name := scanner.Text()
scanner.Scan()
region, _ := strconv.Atoi(scanner.Text())
scanner.Scan()
score, _ := strconv.Atoi(scanner.Text())
regions[region] = append(regions[region], Participant{name, score})
}
out := bufio.NewWriter(os.Stdout)
for i := 1; i <= m; i++ {
sort.Slice(regions[i], func(a, b int) bool {
return regions[i][a].score > regions[i][b].score
})
if len(regions[i]) > 2 && regions[i][1].score == regions[i][2].score {
fmt.Fprintln(out, "?")
} else {
fmt.Fprintln(out, regions[i][0].name, regions[i][1].name)
}
}
out.Flush()
}