public final class GraphC {

   // Adjacency list with nodes 0, 1, ..., n
   final int edges[][];
 
   public GraphC (final int[][] edges) { this.edges = edges; }

   // Delete the nodes 'i' and 'j' and all adjacent edges
   public Graph loseEdges (final int i, final int j) {
      final int n = edges.length;
      final int[][] newedges = new int[n][];

      edgelists:  for (int k = 0; k < n; k++) {
         // if (k!=i && k!=j) continue;
         int z;  // index to remove

         search: {
            if (k == i) {
               for (z = 0; z < edges[k].length; z++)
                  if (edges[k][z] == j) break search;
            } else if (k == j) {
               for (z = 0; z < edges[k].length; z++)
                  if (edges[k][z] == i) break search;
            }

            // No edge to be deleted; share this list.
            newedges[k] = edges[k];
            continue edgelists;

         }  // end search

         final int m = edges[k].length - 1;
         final int [] ne = new int[m];
         System.arraycopy (edges[k], 0, ne, 0, z);
         System.arraycopy (edges[k], z+1, ne, z, m-z);
         newedges[k] = ne;

      } // end edgelists

      return new Graph(newedges);
   }
}