f=
#->a{a.size.times{|i|a[i]-=[i];a.size.times{|j|a[i]<<j if a[j].include?(i)};a[i].uniq!};a}
#->a{n=a.size;n.times{|i|a[i]-=[i];n.times{|j|a[i]<<j if a[j].include?(i)};a[i].uniq!};a}
#->a{n=a.size;n.times{|i|a[i]-=[i];n.times{|j|a[i]<<j if a[j].include?(i)}};a.map &:uniq}
#->a{n=a.size;n.times{|i|a[i]-=[i];n.times{|j|a[i]<<j if(a[j]&[i])[0]}};a.map &:uniq}
#->a{n=a.size;n.times{|i|a[i]-=[i];n.times{|j|(a[j]&[i])[0]&&a[i]<<j}};a.map &:uniq}
#->a{n=a.size;n.times{|i|n.times{|j|(a[j]&[i])[0]&&a[i]<<j&&a[i]=a[i].uniq-[i]}};a}
->k{n=k.size;n.times{|i|n.times{|j|(k[j]&[i])[0]&&k[i]=(k[i]<<j).uniq-[i]}};k}
test = [
[[] , []],
[[[0]] , [[]]],
[[[],[0,1]] , [[1],[0]]],
[[[0,1],[]] , [[1],[0]]],
[[[0,1],[0],[1,0,3],[]] , [[1,2],[0,2],[0,1,3],[2]]],
[[[3],[],[5],[3],[1,3],[4]] , [[3],[4],[5],[0,4],[1,3,5],[2,4]]],
[[[0,1],[6],[],[3],[3],[1],[4,2]] , [[1],[0,5,6],[6],[4],[3,6],[1],[1,2,4]]],
[[[6],[0,5,1],[5,4],[3,5],[4],[5,6],[0,3]] , [[1,6],[0,5],[4,5],[5,6],[2],[1,2,3,6],[0,3,5]]],
[[[1,0],[5,1],[5],[1],[5,7],[7,1],[],[1]] , [[1],[0,3,5,7],[5],[1],[5,7],[1,2,4,7],[],[1,4,5]]],
[[[2,8,0,9],[5,2,3,4],[0,2],[3,7,4],[8,1,2],[5,1,9,2],[6,9],[6,5,2,9,0],[9,1,2,0],[3,9]] , [[2,7,8,9],[2,3,4,5,8],[0,1,4,5,7,8],[1,4,7,9],[1,2,3,8],[1,2,7,9],[7,9],[0,2,3,5,6,9],[0,1,2,4,9],[0,3,5,6,7,8]]]
]
test.each_with_index do |t,i|
inp = t[0]
out = t[1]
res = f[inp]
out.map!(&:sort)
res.map!(&:sort)
puts "test #{i} #{out==res ? 'passed' : 'failed'}"
end
Zj0KIy0+YXthLnNpemUudGltZXN7fGl8YVtpXS09W2ldO2Euc2l6ZS50aW1lc3t8anxhW2ldPDxqIGlmIGFbal0uaW5jbHVkZT8oaSl9O2FbaV0udW5pcSF9O2F9CiMtPmF7bj1hLnNpemU7bi50aW1lc3t8aXxhW2ldLT1baV07bi50aW1lc3t8anxhW2ldPDxqIGlmIGFbal0uaW5jbHVkZT8oaSl9O2FbaV0udW5pcSF9O2F9CiMtPmF7bj1hLnNpemU7bi50aW1lc3t8aXxhW2ldLT1baV07bi50aW1lc3t8anxhW2ldPDxqIGlmIGFbal0uaW5jbHVkZT8oaSl9fTthLm1hcCAmOnVuaXF9CiMtPmF7bj1hLnNpemU7bi50aW1lc3t8aXxhW2ldLT1baV07bi50aW1lc3t8anxhW2ldPDxqIGlmKGFbal0mW2ldKVswXX19O2EubWFwICY6dW5pcX0KIy0+YXtuPWEuc2l6ZTtuLnRpbWVze3xpfGFbaV0tPVtpXTtuLnRpbWVze3xqfChhW2pdJltpXSlbMF0mJmFbaV08PGp9fTthLm1hcCAmOnVuaXF9CiMtPmF7bj1hLnNpemU7bi50aW1lc3t8aXxuLnRpbWVze3xqfChhW2pdJltpXSlbMF0mJmFbaV08PGomJmFbaV09YVtpXS51bmlxLVtpXX19O2F9CiAtPmt7bj1rLnNpemU7bi50aW1lc3t8aXxuLnRpbWVze3xqfChrW2pdJltpXSlbMF0mJmtbaV09KGtbaV08PGopLnVuaXEtW2ldfX07a30KCnRlc3QgPSBbCltbXSAsIFtdXSwKW1tbMF1dICwgW1tdXV0sCltbW10sWzAsMV1dICwgW1sxXSxbMF1dXSwKW1tbMCwxXSxbXV0gLCBbWzFdLFswXV1dLApbW1swLDFdLFswXSxbMSwwLDNdLFtdXSAsIFtbMSwyXSxbMCwyXSxbMCwxLDNdLFsyXV1dLApbW1szXSxbXSxbNV0sWzNdLFsxLDNdLFs0XV0gLCBbWzNdLFs0XSxbNV0sWzAsNF0sWzEsMyw1XSxbMiw0XV1dLApbW1swLDFdLFs2XSxbXSxbM10sWzNdLFsxXSxbNCwyXV0gLCBbWzFdLFswLDUsNl0sWzZdLFs0XSxbMyw2XSxbMV0sWzEsMiw0XV1dLApbW1s2XSxbMCw1LDFdLFs1LDRdLFszLDVdLFs0XSxbNSw2XSxbMCwzXV0gLCBbWzEsNl0sWzAsNV0sWzQsNV0sWzUsNl0sWzJdLFsxLDIsMyw2XSxbMCwzLDVdXV0sCltbWzEsMF0sWzUsMV0sWzVdLFsxXSxbNSw3XSxbNywxXSxbXSxbMV1dICwgW1sxXSxbMCwzLDUsN10sWzVdLFsxXSxbNSw3XSxbMSwyLDQsN10sW10sWzEsNCw1XV1dLApbW1syLDgsMCw5XSxbNSwyLDMsNF0sWzAsMl0sWzMsNyw0XSxbOCwxLDJdLFs1LDEsOSwyXSxbNiw5XSxbNiw1LDIsOSwwXSxbOSwxLDIsMF0sWzMsOV1dICwgW1syLDcsOCw5XSxbMiwzLDQsNSw4XSxbMCwxLDQsNSw3LDhdLFsxLDQsNyw5XSxbMSwyLDMsOF0sWzEsMiw3LDldLFs3LDldLFswLDIsMyw1LDYsOV0sWzAsMSwyLDQsOV0sWzAsMyw1LDYsNyw4XV1dCl0KCnRlc3QuZWFjaF93aXRoX2luZGV4IGRvIHx0LGl8CiAgICBpbnAgPSB0WzBdCiAgICBvdXQgPSB0WzFdCiAgICByZXMgPSBmW2lucF0KICAgIG91dC5tYXAhKCY6c29ydCkKICAgIHJlcy5tYXAhKCY6c29ydCkKICAgIHB1dHMgInRlc3QgI3tpfSAje291dD09cmVzID8gJ3Bhc3NlZCcgOiAnZmFpbGVkJ30iCmVuZA==