import numpy as np
from collections import deque
def bfs_finder(d, start):
sorter = np.argsort(d[:, 0])
done = set()
todo = deque([start])
output = np.empty_like(d)
pos = 0
while todo:
key = todo.popleft()
if key in done:
continue
done.add(key)
left = np.searchsorted(d[:, 0], key, 'left', sorter)
if left >= d.shape[0] or d[sorter[left], 0] != key:
continue
right = np.searchsorted(d[:, 0], key, 'right', sorter)
next = pos + right - left
output[pos:next, :] = d[sorter[left:right], :]
todo.extend(output[pos:next, 1])
pos = next
return output
arr = np.array([[1, 7], [2, 0], [2, 1], [2, 3], [3, 4], [3, 5], [5, 6]])
print(bfs_finder(arr, 2))
aW1wb3J0IG51bXB5IGFzIG5wCmZyb20gY29sbGVjdGlvbnMgaW1wb3J0IGRlcXVlCgpkZWYgYmZzX2ZpbmRlcihkLCBzdGFydCk6CiAgICBzb3J0ZXIgPSBucC5hcmdzb3J0KGRbOiwgMF0pCiAgICBkb25lID0gc2V0KCkKICAgIHRvZG8gPSBkZXF1ZShbc3RhcnRdKQogICAgb3V0cHV0ID0gbnAuZW1wdHlfbGlrZShkKQogICAgcG9zID0gMAogICAgd2hpbGUgdG9kbzoKICAgICAgICBrZXkgPSB0b2RvLnBvcGxlZnQoKQogICAgICAgIGlmIGtleSBpbiBkb25lOgogICAgICAgICAgICBjb250aW51ZQogICAgICAgIGRvbmUuYWRkKGtleSkKICAgICAgICBsZWZ0ID0gbnAuc2VhcmNoc29ydGVkKGRbOiwgMF0sIGtleSwgJ2xlZnQnLCBzb3J0ZXIpCiAgICAgICAgaWYgbGVmdCA+PSBkLnNoYXBlWzBdIG9yIGRbc29ydGVyW2xlZnRdLCAwXSAhPSBrZXk6CiAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgcmlnaHQgPSBucC5zZWFyY2hzb3J0ZWQoZFs6LCAwXSwga2V5LCAncmlnaHQnLCBzb3J0ZXIpCiAgICAgICAgbmV4dCA9IHBvcyArIHJpZ2h0IC0gbGVmdAogICAgICAgIG91dHB1dFtwb3M6bmV4dCwgOl0gPSBkW3NvcnRlcltsZWZ0OnJpZ2h0XSwgOl0KICAgICAgICB0b2RvLmV4dGVuZChvdXRwdXRbcG9zOm5leHQsIDFdKQogICAgICAgIHBvcyA9IG5leHQKICAgIHJldHVybiBvdXRwdXQKCmFyciA9IG5wLmFycmF5KFtbMSwgN10sIFsyLCAwXSwgWzIsIDFdLCBbMiwgM10sIFszLCA0XSwgWzMsIDVdLCBbNSwgNl1dKQpwcmludChiZnNfZmluZGVyKGFyciwgMikp