private void cliques(
            List<Vertex> likelyC,
            List<Vertex> C,
            List<Vertex> F)
    {
        List<Vertex> candidates_array = new ArrayList<Vertex>(C);
        if (!allEdgesSeen(C, F)) {
            for (Vertex candidate : candidates_array) {
                List<Vertex> new_candidates = new ArrayList<Vertex>();
                List<Vertex> new_already_found = new ArrayList<Vertex>();

                likelyC.add(candidate);
                C.remove(candidate);
                for (Vertex new_candidate : C) {
                    if(g.isEdge(candidate,new_candidate)) {
                        new_candidates.add(new_candidate);
                    }
                }

                for (Vertex new_found : F) {
                    if (g.isEdge(candidate, new_found)) {
                        new_already_found.add(new_found);
                    }
                }

                if (new_candidates.isEmpty() && new_already_found.isEmpty()) {
                    maxCliques.add(new Vector<Vertex>(likelyC));
                }
                else {
                    cliques(
                            likelyC,
                            new_candidates,
                            new_already_found);
                }

                F.add(candidate);
                likelyC.remove(candidate);
            }
        }
    }