← Home
package main

import (
	"bufio"
	"fmt"
	"math"
	"os"
	"sort"
)

func main() {
	scanner := bufio.NewScanner(os.Stdin)
	buf := make([]byte, 1024*1024)
	scanner.Buffer(buf, len(buf))
	scanner.Split(bufio.ScanWords)

	readInt := func() int {
		scanner.Scan()
		res := 0
		for _, b := range scanner.Bytes() {
			res = res*10 + int(b-'0')
		}
		return res
	}

	if !scanner.Scan() {
		return
	}
	t := 0
	for _, b := range scanner.Bytes() {
		t = t*10 + int(b-'0')
	}

	out := bufio.NewWriter(os.Stdout)
	defer out.Flush()

	for tc := 0; tc < t; tc++ {
		n := readInt()
		setsFlat := make([]int, 0)
		setsHead := make([]int, n+1)

		for i := 0; i < n; i++ {
			k := readInt()
			setsHead[i] = len(setsFlat)
			for j := 0; j < k; j++ {
				setsFlat = append(setsFlat, readInt())
			}
		}
		setsHead[n] = len(setsFlat)
		totalK := len(setsFlat)

		allElems := make([]int, totalK)
		copy(allElems, setsFlat)
		sort.Ints(allElems)

		U := 0
		for i := 0; i < len(allElems); i++ {
			if i == 0 || allElems[i] != allElems[i-1] {
				allElems[U] = allElems[i]
				U++
			}
		}
		allElems = allElems[:U]

		for i := 0; i < totalK; i++ {
			val := setsFlat[i]
			l, r := 0, U-1
			for l <= r {
				m := (l + r) >> 1
				if allElems[m] == val {
					setsFlat[i] = m + 1
					break
				} else if allElems[m] < val {
					l = m + 1
				} else {
					r = m - 1
				}
			}
		}

		freq := make([]int, U+1)
		for _, x := range setsFlat {
			freq[x]++
		}

		posHead := make([]int, U+2)
		for x := 1; x <= U; x++ {
			posHead[x+1] = posHead[x] + freq[x]
		}
		posCur := make([]int, U+1)
		copy(posCur, posHead)

		posData := make([]int, totalK)
		for i := 0; i < n; i++ {
			set := setsFlat[setsHead[i]:setsHead[i+1]]
			for _, x := range set {
				posData[posCur[x]] = i
				posCur[x]++
			}
		}

		B := int(math.Sqrt(float64(totalK)))
		if B < 2 {
			B = 2
		}

		count := make([]int, n)
		found := false
		var ans1, ans2 int

		for i := 0; i < n; i++ {
			set := setsFlat[setsHead[i]:setsHead[i+1]]
			for _, x := range set {
				if freq[x] >= B {
					continue
				}
				p := posData[posHead[x]:posHead[x+1]]
				for _, j := range p {
					if j >= i {
						break
					}
					if count[j] == 1 {
						ans1, ans2 = j, i
						found = true
						break
					}
					count[j] = 1
				}
				if found {
					break
				}
			}
			if found {
				break
			}
			for _, x := range set {
				if freq[x] >= B {
					continue
				}
				p := posData[posHead[x]:posHead[x+1]]
				for _, j := range p {
					if j >= i {
						break
					}
					count[j] = 0
				}
			}
		}

		if !found {
			seenIn := make([]int, U+1)
			for i := 0; i <= U; i++ {
				seenIn[i] = -1
			}

			for x := 1; x <= U; x++ {
				if freq[x] < B {
					continue
				}
				p := posData[posHead[x]:posHead[x+1]]
				for _, i := range p {
					set := setsFlat[setsHead[i]:setsHead[i+1]]
					for _, y := range set {
						if y == x {
							continue
						}
						if seenIn[y] != -1 {
							ans1, ans2 = seenIn[y], i
							found = true
							break
						}
						seenIn[y] = i
					}
					if found {
						break
					}
				}
				if found {
					break
				}
				for _, i := range p {
					set := setsFlat[setsHead[i]:setsHead[i+1]]
					for _, y := range set {
						seenIn[y] = -1
					}
				}
			}
		}

		if found {
			fmt.Fprintf(out, "%d %d\n", ans1+1, ans2+1)
		} else {
			fmt.Fprintln(out, "-1")
		}
	}
}