bidirectional algorithm