static class Graph{

        private static class Edge{
            int node;
            int next;

            Edge(int node, int next){
                this.node = node;
                this.next = next;
            }
        }

        public final static int NIL = -1;
        private int[] head;
        private ArrayList<Edge> graph;

        private int N;
        private int contor;

        void initialize(final int N){
            head = new int[N];
            graph = new ArrayList<>();

            System.gc();

            this.N = N;
            this.contor = 0;

            for (int i = 0; i < N; ++i)
                head[i] = NIL;
        }

        void addEdge(int x, int y){
            x--; y--;
            graph.add(new Edge(y, head[x]));
            head[x] = contor++;
        }

        int getHead(int node){
            node--;
            return head[node];
        }

        int getNext(int p){
            assert 0 <= p && p < contor;
            return graph.get(p).next;
        }

        int getNeighbour(int p){
            assert 0 <= p && p < contor;
            return graph.get(p).node + 1;
        }
    }

@@ -14,20 +14,16 @@
 Graph%7B%0A%0A
-    
     priv
@@ -49,28 +49,24 @@
 ge%7B%0A        
-    
 int node;%0A  
@@ -67,28 +67,24 @@
 de;%0A        
-  
-  
 int next;%0A%0A 
@@ -82,20 +82,16 @@
  next;%0A%0A
-    
         
@@ -116,20 +116,16 @@
  next)%7B%0A
-    
         
@@ -154,28 +154,24 @@
             
-    
 this.next = 
@@ -188,29 +188,17 @@
     
-    %7D%0A  
+%7D%0A
     
-  
 %7D%0A%0A
-    
     
@@ -231,20 +231,16 @@
 L = -1;%0A
-    
     priv
@@ -255,20 +255,16 @@
 %5D head;%0A
-    
     priv
@@ -291,20 +291,16 @@
 graph;%0A%0A
-    
     priv
@@ -314,20 +314,16 @@
  N;%0A    
-  
-  
 private 
@@ -335,20 +335,16 @@
 ontor;%0A%0A
-    
     void
@@ -369,20 +369,16 @@
 int N)%7B%0A
-    
         
@@ -400,28 +400,24 @@
 N%5D;%0A        
-    
 graph = new 
@@ -440,20 +440,16 @@
         
-    
 System.g
@@ -458,28 +458,24 @@
 );%0A%0A        
-  
-  
 this.N = N;%0A
@@ -474,20 +474,16 @@
 .N = N;%0A
-    
         
@@ -500,20 +500,16 @@
 r = 0;%0A%0A
-    
         
@@ -544,28 +544,24 @@
             
-    
 head%5Bi%5D = NI
@@ -563,20 +563,16 @@
  = NIL;%0A
-    
     %7D%0A%0A 
@@ -574,20 +574,16 @@
  %7D%0A%0A    
-  
-  
 void add
@@ -610,20 +610,16 @@
         
-    
 x--; y--
@@ -616,28 +616,24 @@
   x--; y--;%0A
-    
         grap
@@ -665,28 +665,24 @@
 ));%0A        
-    
 head%5Bx%5D = co
@@ -689,20 +689,16 @@
 ntor++;%0A
-    
     %7D%0A%0A 
@@ -696,28 +696,24 @@
 %0A    %7D%0A%0A    
-  
-  
 int getHead(
@@ -735,20 +735,16 @@
     
-    
 node--;%0A
     
@@ -735,28 +735,24 @@
     node--;%0A
-    
         retu
@@ -766,35 +766,27 @@
 %5Bnode%5D;%0A    
-    %7D%0A%0A    
+%7D%0A%0A
     int getN
@@ -797,36 +797,32 @@
 int p)%7B%0A        
-  
-  
 assert 0 %3C= p &&
@@ -834,36 +834,32 @@
 contor;%0A        
-    
 return graph.get
@@ -872,23 +872,15 @@
 xt;%0A
-    
     %7D%0A%0A
-    
     
@@ -900,28 +900,24 @@
 our(int p)%7B%0A
-    
         asse
@@ -945,28 +945,24 @@
 or;%0A        
-  
-  
 return graph
@@ -979,24 +979,16 @@
 de + 1;%0A    
-    %7D%0A    
+%7D%0A
 %7D%0A

Update Graph.java