private static bool TryKuhn(bool[] used, int[][] g, int[] mt, int v) {
if (used[v]) return false;
used[v] = true;
for (var i = 0; i < g[v].Length; i++) {
var to = g[v][i];
if (mt[to] == -1 || TryKuhn(used, g, mt, mt[to])) {
mt[to] = v;
return true;
}
}
return false;
}