← Home
package main

import (
	"fmt"
	"io"
	"os"
	"sort"
)

type Scanner struct {
	b   []byte
	pos int
}

func (s *Scanner) NextInt() int {
	for s.pos < len(s.b) && (s.b[s.pos] < '0' || s.b[s.pos] > '9') {
		s.pos++
	}
	if s.pos >= len(s.b) {
		return 0
	}
	res := 0
	for s.pos < len(s.b) && s.b[s.pos] >= '0' && s.b[s.pos] <= '9' {
		res = res*10 + int(s.b[s.pos]-'0')
		s.pos++
	}
	return res
}

type User struct {
	id   int
	acts []int
}

func main() {
	b, _ := io.ReadAll(os.Stdin)
	s := &Scanner{b: b, pos: 0}

	n := s.NextInt()
	m := s.NextInt()
	if n == 0 {
		return
	}

	users := make([]User, n)
	for i := 0; i < n; i++ {
		k := s.NextInt()
		users[i] = User{id: i + 1, acts: make([]int, k)}
		for j := 0; j < k; j++ {
			users[i].acts[j] = s.NextInt()
		}
	}

	sort.Slice(users, func(i, j int) bool {
		return len(users[i].acts) < len(users[j].acts)
	})

	rep := make([]int, m+1)
	inU := make([]bool, m+1)
	isChecked := make([]int, n)

	for u := 0; u < n; u++ {
		for _, x := range users[u].acts {
			inU[x] = true
		}

		for _, x := range users[u].acts {
			vPlus1 := rep[x]
			if vPlus1 == 0 {
				rep[x] = u + 1
				continue
			}
			v := vPlus1 - 1

			if isChecked[v] == u+1 {
				rep[x] = u + 1
				continue
			}
			isChecked[v] = u + 1

			isSubset := true
			for _, y := range users[v].acts {
				if !inU[y] {
					isSubset = false
					break
				}
			}

			if !isSubset {
				fmt.Println("YES")
				fmt.Printf("%d %d\n", users[v].id, users[u].id)
				return
			}

			rep[x] = u + 1
		}

		for _, x := range users[u].acts {
			inU[x] = false
		}
	}

	fmt.Println("NO")
}