using static IO;
public class IO
{
public static IO Cin = new();
public static StreamReader reader = new(Console.OpenStandardInput());
public static StreamWriter writer = new(Console.OpenStandardOutput());
public static implicit operator string(IO _) => reader.ReadLine();
public static implicit operator char[](IO _) => reader.ReadLine().ToArray();
public static implicit operator int(IO _) => int.Parse(reader.ReadLine());
public static implicit operator double(IO _) => double.Parse(reader.ReadLine());
public static implicit operator string[](IO _) => reader.ReadLine().Split();
public static implicit operator int[](IO _) => Array.ConvertAll(reader.ReadLine().Split(), int.Parse);
public void Deconstruct(out int a, out int b) { int[] r = Cin; (a, b) = (r[0], r[1]); }
public void Deconstruct(out int a, out int b, out int c) { int[] r = Cin; (a, b, c) = (r[0], r[1], r[2]); }
public static IEnumerable<int> MakeRange(int start, int count) => Enumerable.Range(start, count);
public static T[] MakeArray<T>(int count) where T : new() => MakeRange(0, count).Select(_ => new T()).ToArray();
public static object? Cout { set { writer.Write(value); } }
public static object? Coutln { set { writer.WriteLine(value); } }
public static void Main() { Program.Coding(); writer.Flush(); }
}
class Program
{
public static void Coding()
{
checked
{
(int applicantCount, int groupCount, int groupLimit) = Cin;
int[][] graph = MakeRange(0, applicantCount).Select(_ => ((int[])Cin)[1..]).ToArray();
int[] score = Cin;
int[] matchGroup = new int[groupCount * groupLimit]; Array.Fill(matchGroup, -1);
bool[] visited = new bool[matchGroup.Length];
bool Dfs(int me)
{
foreach (int group in graph[me])
{
for (int end = group * groupLimit, g = end - groupLimit; g < end; g++)
{
if (visited[g]) continue;
visited[g] = true;
if (matchGroup[g] < 0 || Dfs(matchGroup[g]))
{
matchGroup[g] = me;
return true;
}
}
}
return false;
}
foreach (int me in MakeRange(0, applicantCount).OrderByDescending(i => score[i]))
{
Array.Fill(visited, false);
Dfs(me);
}
foreach(var join in MakeRange(0, groupCount).Select(g => matchGroup.Skip(g*groupLimit).Take(groupLimit).Where(m => m >= 0)))
{
LinkedList<int> output =new(join.Select(m => m+1));
output.AddFirst(output.Count);
Coutln = string.Join(' ', output);
}
}
}
}
dXNpbmcgc3RhdGljIElPOwpwdWJsaWMgY2xhc3MgSU8KewpwdWJsaWMgc3RhdGljIElPIENpbiA9IG5ldygpOwpwdWJsaWMgc3RhdGljIFN0cmVhbVJlYWRlciByZWFkZXIgPSBuZXcoQ29uc29sZS5PcGVuU3RhbmRhcmRJbnB1dCgpKTsKcHVibGljIHN0YXRpYyBTdHJlYW1Xcml0ZXIgd3JpdGVyID0gbmV3KENvbnNvbGUuT3BlblN0YW5kYXJkT3V0cHV0KCkpOwpwdWJsaWMgc3RhdGljIGltcGxpY2l0IG9wZXJhdG9yIHN0cmluZyhJTyBfKSA9PiByZWFkZXIuUmVhZExpbmUoKTsKcHVibGljIHN0YXRpYyBpbXBsaWNpdCBvcGVyYXRvciBjaGFyW10oSU8gXykgPT4gcmVhZGVyLlJlYWRMaW5lKCkuVG9BcnJheSgpOwpwdWJsaWMgc3RhdGljIGltcGxpY2l0IG9wZXJhdG9yIGludChJTyBfKSA9PiBpbnQuUGFyc2UocmVhZGVyLlJlYWRMaW5lKCkpOwpwdWJsaWMgc3RhdGljIGltcGxpY2l0IG9wZXJhdG9yIGRvdWJsZShJTyBfKSA9PiBkb3VibGUuUGFyc2UocmVhZGVyLlJlYWRMaW5lKCkpOwpwdWJsaWMgc3RhdGljIGltcGxpY2l0IG9wZXJhdG9yIHN0cmluZ1tdKElPIF8pID0+IHJlYWRlci5SZWFkTGluZSgpLlNwbGl0KCk7CnB1YmxpYyBzdGF0aWMgaW1wbGljaXQgb3BlcmF0b3IgaW50W10oSU8gXykgPT4gQXJyYXkuQ29udmVydEFsbChyZWFkZXIuUmVhZExpbmUoKS5TcGxpdCgpLCBpbnQuUGFyc2UpOwpwdWJsaWMgdm9pZCBEZWNvbnN0cnVjdChvdXQgaW50IGEsIG91dCBpbnQgYikgeyBpbnRbXSByID0gQ2luOyAoYSwgYikgPSAoclswXSwgclsxXSk7IH0KcHVibGljIHZvaWQgRGVjb25zdHJ1Y3Qob3V0IGludCBhLCBvdXQgaW50IGIsIG91dCBpbnQgYykgeyBpbnRbXSByID0gQ2luOyAoYSwgYiwgYykgPSAoclswXSwgclsxXSwgclsyXSk7IH0KcHVibGljIHN0YXRpYyBJRW51bWVyYWJsZTxpbnQ+IE1ha2VSYW5nZShpbnQgc3RhcnQsIGludCBjb3VudCkgPT4gRW51bWVyYWJsZS5SYW5nZShzdGFydCwgY291bnQpOwpwdWJsaWMgc3RhdGljIFRbXSBNYWtlQXJyYXk8VD4oaW50IGNvdW50KSB3aGVyZSBUIDogbmV3KCkgPT4gTWFrZVJhbmdlKDAsIGNvdW50KS5TZWxlY3QoXyA9PiBuZXcgVCgpKS5Ub0FycmF5KCk7CnB1YmxpYyBzdGF0aWMgb2JqZWN0PyBDb3V0IHsgc2V0IHsgd3JpdGVyLldyaXRlKHZhbHVlKTsgfSB9CnB1YmxpYyBzdGF0aWMgb2JqZWN0PyBDb3V0bG4geyBzZXQgeyB3cml0ZXIuV3JpdGVMaW5lKHZhbHVlKTsgfSB9CnB1YmxpYyBzdGF0aWMgdm9pZCBNYWluKCkgeyBQcm9ncmFtLkNvZGluZygpOyB3cml0ZXIuRmx1c2goKTsgfQp9CmNsYXNzIFByb2dyYW0KewogICAgcHVibGljIHN0YXRpYyB2b2lkIENvZGluZygpCiAgICB7CiAgICAgICAgY2hlY2tlZAogICAgICAgIHsKICAgICAgICAgICAgKGludCBhcHBsaWNhbnRDb3VudCwgaW50IGdyb3VwQ291bnQsIGludCBncm91cExpbWl0KSA9IENpbjsKICAgICAgICAgICAgaW50W11bXSBncmFwaCA9IE1ha2VSYW5nZSgwLCBhcHBsaWNhbnRDb3VudCkuU2VsZWN0KF8gPT4gKChpbnRbXSlDaW4pWzEuLl0pLlRvQXJyYXkoKTsKCiAgICAgICAgICAgIGludFtdIHNjb3JlID0gQ2luOwogICAgICAgICAgICBpbnRbXSBtYXRjaEdyb3VwID0gbmV3IGludFtncm91cENvdW50ICogZ3JvdXBMaW1pdF07IEFycmF5LkZpbGwobWF0Y2hHcm91cCwgLTEpOwogICAgICAgICAgICBib29sW10gdmlzaXRlZCA9IG5ldyBib29sW21hdGNoR3JvdXAuTGVuZ3RoXTsKICAgICAgICAgICAgYm9vbCBEZnMoaW50IG1lKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBmb3JlYWNoIChpbnQgZ3JvdXAgaW4gZ3JhcGhbbWVdKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGVuZCA9IGdyb3VwICogZ3JvdXBMaW1pdCwgZyA9IGVuZCAtIGdyb3VwTGltaXQ7IGcgPCBlbmQ7IGcrKykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2aXNpdGVkW2ddKSBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICAgICAgdmlzaXRlZFtnXSA9IHRydWU7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAobWF0Y2hHcm91cFtnXSA8IDAgfHwgRGZzKG1hdGNoR3JvdXBbZ10pKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaEdyb3VwW2ddID0gbWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmb3JlYWNoIChpbnQgbWUgaW4gTWFrZVJhbmdlKDAsIGFwcGxpY2FudENvdW50KS5PcmRlckJ5RGVzY2VuZGluZyhpID0+IHNjb3JlW2ldKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgQXJyYXkuRmlsbCh2aXNpdGVkLCBmYWxzZSk7CiAgICAgICAgICAgICAgICBEZnMobWUpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBmb3JlYWNoKHZhciBqb2luIGluIE1ha2VSYW5nZSgwLCBncm91cENvdW50KS5TZWxlY3QoZyA9PiBtYXRjaEdyb3VwLlNraXAoZypncm91cExpbWl0KS5UYWtlKGdyb3VwTGltaXQpLldoZXJlKG0gPT4gbSA+PSAwKSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIExpbmtlZExpc3Q8aW50PiBvdXRwdXQgPW5ldyhqb2luLlNlbGVjdChtID0+IG0rMSkpOwogICAgICAgICAgICAgICAgb3V0cHV0LkFkZEZpcnN0KG91dHB1dC5Db3VudCk7CiAgICAgICAgICAgICAgICBDb3V0bG4gPSBzdHJpbmcuSm9pbignICcsIG91dHB1dCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9Cn0=