public List<List<String>> findLadders(String start, String end, Set<String> dict) {
            List<List<String>> allLadders = new ArrayList<>();
            if (start == null || end == null || start.length() != end.length()) 
                return allLadders;
            
            Set<Node> last;
            Set<Node> next = new LinkedHashSet<>();
            Node startNode = new Node(start, null),
                    endNode = new Node(end, null);
            next.add(startNode);
            dict.remove(start);
            dict.add(end);
            
            int depth = 0;
            while (!next.isEmpty()) {
                depth++;
                
                last = next;
                next = new LinkedHashSet<>();
                for (Node n : last) {
                    if (n.value.equals(end)) {
                        endNode = n;
                        break;
                    }
                    
                    next.addAll(this.getAdjacent(dict, n, endNode));
                }
            }
            
            if (endNode != null) {
                this.getLadders(startNode, endNode, new ArrayList<String>(), allLadders);
            }
            
            return allLadders;
        }