using System; using static System.Console; using System.Linq; using System.Collections.Generic; using System.Security.Cryptography; using Microsoft.VisualBasic; class Program { static int NN => int.Parse(ReadLine()); static long[] NList => ReadLine().Split().Select(long.Parse).ToArray(); public static void Main() { Solve(); } static void Solve() { var q = NN; var ans = new int[q][]; for (var u = 0; u < q; ++u) { var c = NList; var tv = NList; var tc = NList; var bv = NList; var bc = NList; var s = NList; for (var i = 0; i < tc.Length; ++i) --tc[i]; for (var i = 0; i < bc.Length; ++i) --bc[i]; ans[u] = Resort((int)c[0], (int)c[1], (int)c[2], c[3], tv, tc, bv, bc, s); } WriteLine(string.Join("\n", ans.Select(ai => string.Join(" ", ai)))); } static int[] Resort(int n, int m, int k, long p, long[] tv, long[] tc, long[] bv, long[] bc, long[] s) { if (n > m) { var ans = Resort(m, n, k, p, bv, bc, tv, tc, s); return new int[] { ans[1], ans[0] }; } var setlist = new Dictionary>(); for (var i = 0; i < n; ++i) if (!setlist.ContainsKey(tc[i])) setlist[tc[i]] = new List(); var list = new List(); for (var i = 0; i < m; ++i) { if (setlist.ContainsKey(bc[i])) setlist[bc[i]].Add(bv[i]); list.Add(bv[i]); } foreach (var kv in setlist) kv.Value.Sort(); list.Sort(); var ok = 2_000_000_000; var ng = 0; while (ok - ng > 1) { var mid = (ok + ng) / 2; var count = 0L; for (var i = 0; i < n; ++i) { count += UpperBound(mid - tv[i], list) + UpperBound(mid - tv[i] + s[tc[i]], setlist[tc[i]]) - UpperBound(mid - tv[i], setlist[tc[i]]); } if (count >= p) ok = mid; else ng = mid; } var setdic = new Dictionary>(); foreach (var kv in setlist) { setdic[kv.Key] = new Dictionary(); foreach (var li in kv.Value) { if (setdic[kv.Key].ContainsKey(li)) ++setdic[kv.Key][li]; else setdic[kv.Key][li] = 1; } } var dic = new Dictionary(); for (var i = 0; i < m; ++i) { if (dic.ContainsKey(bv[i])) ++dic[bv[i]]; else dic[bv[i]] = 1; } for (var i = 0; i < n; ++i) { var setcount = 0; if (setdic[tc[i]].ContainsKey(ok - tv[i] + s[tc[i]])) setcount = setdic[tc[i]][ok - tv[i] + s[tc[i]]]; var singlecount = 0; if (dic.ContainsKey(ok - tv[i])) singlecount = dic[ok - tv[i]]; if (setcount > 0) { for (var j = 0; j < m; ++j) if (tc[i] == bc[j] && tv[i] + bv[j] - s[tc[i]] == ok) return new int[] { i + 1, j + 1 }; } if (singlecount > setcount) { for (var j = 0; j < m; ++j) if (tc[i] != bc[j] && tv[i] + bv[j] == ok) return new int[] { i + 1, j + 1 }; } } return null; } static int UpperBound(T min, IList list) where T: IComparable { var ng = -1; var ok = list.Count; while (ok - ng > 1) { var mid = (ng + ok) / 2; if (list[mid].CompareTo(min) <= 0) ng = mid; else ok = mid; } return ok; } }