diff --git a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/format/LogAlgorithmForPathMergeInputFormat.java b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/format/LogAlgorithmForPathMergeInputFormat.java
index 3fe04ff..0b0055b 100644
--- a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/format/LogAlgorithmForPathMergeInputFormat.java
+++ b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/format/LogAlgorithmForPathMergeInputFormat.java
@@ -66,8 +66,10 @@
                 /**
                  * set the vertex value
                  */
-                vertexValue.setIncomingList(node.getIncomingList());
-                vertexValue.setOutgoingList(node.getOutgoingList());
+                vertexValue.setFFList(node.getFFList());
+                vertexValue.setFRList(node.getFRList());
+                vertexValue.setRFList(node.getRFList());
+                vertexValue.setRRList(node.getRRList());
                 vertexValue.setMergeChain(node.getKmer());
                 vertexValue.setState(State.NON_VERTEX);
                 vertex.setVertexValue(vertexValue);
diff --git a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/format/NaiveAlgorithmForPathMergeInputFormat.java b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/format/NaiveAlgorithmForPathMergeInputFormat.java
index 4011838..91634d8 100644
--- a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/format/NaiveAlgorithmForPathMergeInputFormat.java
+++ b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/format/NaiveAlgorithmForPathMergeInputFormat.java
@@ -69,8 +69,10 @@
             /**
              * set the vertex value
              */
-            vertexValue.setIncomingList(node.getIncomingList());
-            vertexValue.setOutgoingList(node.getOutgoingList());
+            vertexValue.setFFList(node.getFFList());
+            vertexValue.setFRList(node.getFRList());
+            vertexValue.setRFList(node.getRFList());
+            vertexValue.setRRList(node.getRRList());
             vertexValue.setMergeChain(node.getKmer());
             vertexValue.setState(State.NON_VERTEX);
             vertex.setVertexValue(vertexValue);
diff --git a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/io/AdjacencyListWritable.java b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/io/AdjacencyListWritable.java
new file mode 100644
index 0000000..fae1970
--- /dev/null
+++ b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/io/AdjacencyListWritable.java
@@ -0,0 +1,62 @@
+package edu.uci.ics.genomix.pregelix.io;
+
+import java.io.DataInput;
+import java.io.DataOutput;
+import java.io.IOException;
+
+import org.apache.hadoop.io.WritableComparable;
+
+import edu.uci.ics.genomix.type.PositionListWritable;
+
+public class AdjacencyListWritable implements WritableComparable<AdjacencyListWritable>{
+    private PositionListWritable forwardList;
+    private PositionListWritable reverseList;
+    
+    public AdjacencyListWritable(){
+        forwardList = new PositionListWritable();
+        reverseList = new PositionListWritable();
+    }
+
+    public void set(AdjacencyListWritable adjacencyList){
+        forwardList.set(adjacencyList.getForwardList());
+        reverseList.set(adjacencyList.getReverseList());
+    }
+    
+    public void reset(){
+        forwardList.reset();
+        reverseList.reset();
+    }
+    
+    public PositionListWritable getForwardList() {
+        return forwardList;
+    }
+
+    public void setForwardList(PositionListWritable forwardList) {
+        this.forwardList = forwardList;
+    }
+
+    public PositionListWritable getReverseList() {
+        return reverseList;
+    }
+
+    public void setReverseList(PositionListWritable reverseList) {
+        this.reverseList = reverseList;
+    }
+
+    @Override
+    public void readFields(DataInput in) throws IOException {
+        forwardList.readFields(in);
+        reverseList.readFields(in);
+    }
+
+    @Override
+    public void write(DataOutput out) throws IOException {
+        forwardList.write(out);
+        reverseList.write(out);
+    }
+
+    @Override
+    public int compareTo(AdjacencyListWritable o) {
+        return 0;
+    }
+}
diff --git a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/io/IncomingListWritable.java b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/io/IncomingListWritable.java
new file mode 100644
index 0000000..8dec857
--- /dev/null
+++ b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/io/IncomingListWritable.java
@@ -0,0 +1,56 @@
+package edu.uci.ics.genomix.pregelix.io;
+
+import java.io.DataInput;
+import java.io.DataOutput;
+import java.io.IOException;
+
+import org.apache.hadoop.io.WritableComparable;
+
+import edu.uci.ics.genomix.type.PositionListWritable;
+
+public class IncomingListWritable implements WritableComparable<IncomingListWritable>{
+    private PositionListWritable reverseForwardList;
+    private PositionListWritable reverseReverseList;
+    
+    public IncomingListWritable(){
+        reverseForwardList = new PositionListWritable();
+        reverseReverseList = new PositionListWritable();
+    }
+
+    public PositionListWritable getReverseForwardList() {
+        return reverseForwardList;
+    }
+
+    public void setReverseForwardList(PositionListWritable reverseForwardList) {
+        this.reverseForwardList = reverseForwardList;
+    }
+
+    public PositionListWritable getReverseReverseList() {
+        return reverseReverseList;
+    }
+
+    public void setReverseReverseList(PositionListWritable reverseReverseList) {
+        this.reverseReverseList = reverseReverseList;
+    }
+
+    @Override
+    public void readFields(DataInput in) throws IOException {
+        reverseForwardList.readFields(in);
+        reverseReverseList.readFields(in);
+    }
+
+    @Override
+    public void write(DataOutput out) throws IOException {
+        reverseForwardList.write(out);
+        reverseReverseList.write(out);
+    }
+
+    @Override
+    public int compareTo(IncomingListWritable o) {
+        return 0;
+    }
+    
+    public int inDegree(){
+        return reverseReverseList.getCountOfPosition() + reverseForwardList.getCountOfPosition();
+    }
+}
diff --git a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/io/MessageWritable.java b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/io/MessageWritable.java
index 31d313d..f0a6b58 100644
--- a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/io/MessageWritable.java
+++ b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/io/MessageWritable.java
@@ -9,7 +9,6 @@
 import edu.uci.ics.genomix.pregelix.type.CheckMessage;
 import edu.uci.ics.genomix.pregelix.type.Message;
 import edu.uci.ics.genomix.type.KmerBytesWritable;
-import edu.uci.ics.genomix.type.PositionListWritable;
 import edu.uci.ics.genomix.type.PositionWritable;
 
 public class MessageWritable implements WritableComparable<MessageWritable> {
@@ -20,7 +19,7 @@
      */
     private PositionWritable sourceVertexId;
     private KmerBytesWritable chainVertexId;
-    private PositionListWritable neighberNode; //incoming or outgoing
+    private AdjacencyListWritable neighberNode; //incoming or outgoing
     private byte message;
 
     private byte checkMessage;
@@ -28,12 +27,12 @@
     public MessageWritable() {
         sourceVertexId = new PositionWritable();
         chainVertexId = new KmerBytesWritable(0);
-        neighberNode = new PositionListWritable();
+        neighberNode = new AdjacencyListWritable();
         message = Message.NON;
         checkMessage = (byte) 0;
     }
 
-    public void set(PositionWritable sourceVertexId, KmerBytesWritable chainVertexId, PositionListWritable neighberNode, byte message) {
+    public void set(PositionWritable sourceVertexId, KmerBytesWritable chainVertexId, AdjacencyListWritable neighberNode, byte message) {
         checkMessage = 0;
         if (sourceVertexId != null) {
             checkMessage |= CheckMessage.SOURCE;
@@ -79,11 +78,11 @@
         }
     }
     
-    public PositionListWritable getNeighberNode() {
+    public AdjacencyListWritable getNeighberNode() {
         return neighberNode;
     }
 
-    public void setNeighberNode(PositionListWritable neighberNode) {
+    public void setNeighberNode(AdjacencyListWritable neighberNode) {
         if(neighberNode != null){
             checkMessage |= CheckMessage.NEIGHBER;
             this.neighberNode.set(neighberNode);
diff --git a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/io/OutgoingListWritable.java b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/io/OutgoingListWritable.java
new file mode 100644
index 0000000..275954d
--- /dev/null
+++ b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/io/OutgoingListWritable.java
@@ -0,0 +1,56 @@
+package edu.uci.ics.genomix.pregelix.io;
+
+import java.io.DataInput;
+import java.io.DataOutput;
+import java.io.IOException;
+
+import org.apache.hadoop.io.WritableComparable;
+
+import edu.uci.ics.genomix.type.PositionListWritable;
+
+public class OutgoingListWritable implements WritableComparable<OutgoingListWritable>{
+    private PositionListWritable forwardForwardList;
+    private PositionListWritable forwardReverseList;
+    
+    public OutgoingListWritable(){
+        forwardForwardList = new PositionListWritable();
+        forwardReverseList = new PositionListWritable();
+    }
+
+    public PositionListWritable getForwardForwardList() {
+        return forwardForwardList;
+    }
+
+    public void setForwardForwardList(PositionListWritable forwardForwardList) {
+        this.forwardForwardList = forwardForwardList;
+    }
+
+    public PositionListWritable getForwardReverseList() {
+        return forwardReverseList;
+    }
+
+    public void setForwardReverseList(PositionListWritable forwardReverseList) {
+        this.forwardReverseList = forwardReverseList;
+    }
+
+    @Override
+    public void readFields(DataInput in) throws IOException {
+        forwardForwardList.readFields(in);
+        forwardReverseList.readFields(in);
+    }
+
+    @Override
+    public void write(DataOutput out) throws IOException {
+        forwardForwardList.write(out);
+        forwardReverseList.write(out);   
+    }
+
+    @Override
+    public int compareTo(OutgoingListWritable o) {
+        return 0;
+    }
+    
+    public int outDegree(){
+        return forwardForwardList.getCountOfPosition() + forwardReverseList.getCountOfPosition();
+    }
+}
diff --git a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/io/ValueStateWritable.java b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/io/ValueStateWritable.java
index 2554c8e..985c2ac 100644
--- a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/io/ValueStateWritable.java
+++ b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/io/ValueStateWritable.java
@@ -10,44 +10,82 @@
 
 public class ValueStateWritable implements WritableComparable<ValueStateWritable> {
 
-    private PositionListWritable incomingList;
-    private PositionListWritable outgoingList;
+    private AdjacencyListWritable incomingList;
+    private AdjacencyListWritable outgoingList;
     private byte state;
     private KmerBytesWritable mergeChain;
 
     public ValueStateWritable() {
-        incomingList = new PositionListWritable();
-        outgoingList = new PositionListWritable();
+        incomingList = new AdjacencyListWritable();
+        outgoingList = new AdjacencyListWritable();
         state = State.NON_VERTEX;
         mergeChain = new KmerBytesWritable(0);
     }
 
-    public ValueStateWritable(PositionListWritable incomingList, PositionListWritable outgoingList, 
+    public ValueStateWritable(PositionListWritable forwardForwardList, PositionListWritable forwardReverseList,
+            PositionListWritable reverseForwardList, PositionListWritable reverseReverseList,
             byte state, KmerBytesWritable mergeChain) {
-        set(incomingList, outgoingList, state, mergeChain);
+        set(forwardForwardList, forwardReverseList, 
+                reverseForwardList, reverseReverseList,
+                state, mergeChain);
     }
 
-    public void set(PositionListWritable incomingList, PositionListWritable outgoingList, 
+    public void set(PositionListWritable forwardForwardList, PositionListWritable forwardReverseList,
+            PositionListWritable reverseForwardList, PositionListWritable reverseReverseList, 
             byte state, KmerBytesWritable mergeChain) {
-        this.incomingList.set(incomingList);
-        this.outgoingList.set(outgoingList);
+        this.incomingList.setForwardList(reverseForwardList);
+        this.incomingList.setReverseList(reverseReverseList);
+        this.outgoingList.setForwardList(forwardForwardList);
+        this.outgoingList.setReverseList(forwardReverseList);
         this.state = state;
         this.mergeChain.set(mergeChain);
     }
     
-    public PositionListWritable getIncomingList() {
+    public PositionListWritable getFFList() {
+        return outgoingList.getForwardList();
+    }
+
+    public PositionListWritable getFRList() {
+        return outgoingList.getReverseList();
+    }
+
+    public PositionListWritable getRFList() {
+        return incomingList.getForwardList();
+    }
+
+    public PositionListWritable getRRList() {
+        return incomingList.getReverseList();
+    }
+    
+    public void setFFList(PositionListWritable forwardForwardList){
+        outgoingList.setForwardList(forwardForwardList);
+    }
+    
+    public void setFRList(PositionListWritable forwardReverseList){
+        outgoingList.setReverseList(forwardReverseList);
+    }
+    
+    public void setRFList(PositionListWritable reverseForwardList){
+        incomingList.setForwardList(reverseForwardList);
+    }
+
+    public void setRRList(PositionListWritable reverseReverseList){
+        incomingList.setReverseList(reverseReverseList);
+    }
+    
+    public AdjacencyListWritable getIncomingList() {
         return incomingList;
     }
 
-    public void setIncomingList(PositionListWritable incomingList) {
+    public void setIncomingList(AdjacencyListWritable incomingList) {
         this.incomingList = incomingList;
     }
 
-    public PositionListWritable getOutgoingList() {
+    public AdjacencyListWritable getOutgoingList() {
         return outgoingList;
     }
 
-    public void setOutgoingList(PositionListWritable outgoingList) {
+    public void setOutgoingList(AdjacencyListWritable outgoingList) {
         this.outgoingList = outgoingList;
     }
 
@@ -94,14 +132,21 @@
 
     @Override
     public String toString() {
-        return state + "\t" + getLengthOfMergeChain() + "\t" + mergeChain.toString();
+        StringBuilder sbuilder = new StringBuilder();
+        sbuilder.append('(');
+        sbuilder.append(outgoingList.getForwardList().toString()).append('\t');
+        sbuilder.append(outgoingList.getReverseList().toString()).append('\t');
+        sbuilder.append(incomingList.getForwardList().toString()).append('\t');
+        sbuilder.append(incomingList.getReverseList().toString()).append('\t');
+        sbuilder.append(mergeChain.toString()).append(')');
+        return sbuilder.toString();
     }
     
-    public int inDegree() {
-        return incomingList.getCountOfPosition();
+    public int inDegree(){
+        return incomingList.getForwardList().getCountOfPosition() + incomingList.getReverseList().getCountOfPosition();
     }
-
-    public int outDegree() {
-        return outgoingList.getCountOfPosition();
+    
+    public int outDegree(){
+        return outgoingList.getForwardList().getCountOfPosition() + outgoingList.getReverseList().getCountOfPosition();
     }
 }
diff --git a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/LogAlgorithmForPathMergeVertex.java b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/LogAlgorithmForPathMergeVertex.java
index 6be0eee..c3bb663 100644
--- a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/LogAlgorithmForPathMergeVertex.java
+++ b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/LogAlgorithmForPathMergeVertex.java
@@ -75,12 +75,18 @@
      * get destination vertex
      */
     public PositionWritable getNextDestVertexId(ValueStateWritable value) {
-        posIterator = value.getOutgoingList().iterator();
+        if(value.getFFList().getCountOfPosition() > 0) // #FFList() > 0
+            posIterator = value.getFFList().iterator();
+        else // #FRList() > 0
+            posIterator = value.getFRList().iterator();
         return posIterator.next();
     }
 
     public PositionWritable getPreDestVertexId(ValueStateWritable value) {
-        posIterator = value.getIncomingList().iterator();
+        if(value.getRFList().getCountOfPosition() > 0) // #RFList() > 0
+            posIterator = value.getRFList().iterator();
+        else // #RRList() > 0
+            posIterator = value.getRRList().iterator();
         return posIterator.next();
     }
 
@@ -88,7 +94,12 @@
      * head send message to all next nodes
      */
     public void sendMsgToAllNextNodes(ValueStateWritable value) {
-        posIterator = value.getOutgoingList().iterator();
+        posIterator = value.getFFList().iterator(); // FFList
+        while(posIterator.hasNext()){
+            destVertexId.set(posIterator.next());
+            sendMsg(destVertexId, outgoingMsg);
+        }
+        posIterator = value.getFRList().iterator(); // FRList
         while(posIterator.hasNext()){
             destVertexId.set(posIterator.next());
             sendMsg(destVertexId, outgoingMsg);
@@ -99,7 +110,12 @@
      * head send message to all previous nodes
      */
     public void sendMsgToAllPreviousNodes(ValueStateWritable value) {
-        posIterator = value.getIncomingList().iterator();
+        posIterator = value.getRFList().iterator(); // RFList
+        while(posIterator.hasNext()){
+            destVertexId.set(posIterator.next());
+            sendMsg(destVertexId, outgoingMsg);
+        }
+        posIterator = value.getRRList().iterator(); // RRList
         while(posIterator.hasNext()){
             destVertexId.set(posIterator.next());
             sendMsg(destVertexId, outgoingMsg);
diff --git a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/NaiveAlgorithmForPathMergeVertex.java b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/NaiveAlgorithmForPathMergeVertex.java
index af38072..4fcc09e 100644
--- a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/NaiveAlgorithmForPathMergeVertex.java
+++ b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/NaiveAlgorithmForPathMergeVertex.java
@@ -80,12 +80,18 @@
      * get destination vertex
      */
     public PositionWritable getNextDestVertexId(ValueStateWritable value) {
-        posIterator = value.getOutgoingList().iterator();
+        if(value.getFFList().getCountOfPosition() > 0) // #FFList() > 0
+            posIterator = value.getFFList().iterator();
+        else // #FRList() > 0
+            posIterator = value.getFRList().iterator();
         return posIterator.next();
     }
 
     public PositionWritable getPreDestVertexId(ValueStateWritable value) {
-        posIterator = value.getIncomingList().iterator();
+        if(value.getRFList().getCountOfPosition() > 0) // #RFList() > 0
+            posIterator = value.getRFList().iterator();
+        else // #RRList() > 0
+            posIterator = value.getRRList().iterator();
         return posIterator.next();
     }
 
@@ -93,7 +99,12 @@
      * head send message to all next nodes
      */
     public void sendMsgToAllNextNodes(ValueStateWritable value) {
-        posIterator = value.getOutgoingList().iterator();
+        posIterator = value.getFFList().iterator(); // FFList
+        while(posIterator.hasNext()){
+            destVertexId.set(posIterator.next());
+            sendMsg(destVertexId, outgoingMsg);
+        }
+        posIterator = value.getFRList().iterator(); // FRList
         while(posIterator.hasNext()){
             destVertexId.set(posIterator.next());
             sendMsg(destVertexId, outgoingMsg);
@@ -104,7 +115,12 @@
      * head send message to all previous nodes
      */
     public void sendMsgToAllPreviousNodes(ValueStateWritable value) {
-        posIterator = value.getIncomingList().iterator();
+        posIterator = value.getRFList().iterator(); // RFList
+        while(posIterator.hasNext()){
+            destVertexId.set(posIterator.next());
+            sendMsg(destVertexId, outgoingMsg);
+        }
+        posIterator = value.getRRList().iterator(); // RRList
         while(posIterator.hasNext()){
             destVertexId.set(posIterator.next());
             sendMsg(destVertexId, outgoingMsg);
diff --git a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/P3ForPathMergeVertex.java b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/P3ForPathMergeVertex.java
index 6f4354a..8a03aa7 100644
--- a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/P3ForPathMergeVertex.java
+++ b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/P3ForPathMergeVertex.java
@@ -87,12 +87,18 @@
      * get destination vertex
      */
     public PositionWritable getNextDestVertexId(ValueStateWritable value) {
-        posIterator = value.getOutgoingList().iterator();
+        if(value.getFFList().getCountOfPosition() > 0) // #FFList() > 0
+            posIterator = value.getFFList().iterator();
+        else // #FRList() > 0
+            posIterator = value.getFRList().iterator();
         return posIterator.next();
     }
 
     public PositionWritable getPreDestVertexId(ValueStateWritable value) {
-        posIterator = value.getIncomingList().iterator();
+        if(value.getRFList().getCountOfPosition() > 0) // #RFList() > 0
+            posIterator = value.getRFList().iterator();
+        else // #RRList() > 0
+            posIterator = value.getRRList().iterator();
         return posIterator.next();
     }
 
@@ -100,7 +106,12 @@
      * head send message to all next nodes
      */
     public void sendMsgToAllNextNodes(ValueStateWritable value) {
-        posIterator = value.getOutgoingList().iterator();
+        posIterator = value.getFFList().iterator(); // FFList
+        while(posIterator.hasNext()){
+            destVertexId.set(posIterator.next());
+            sendMsg(destVertexId, outgoingMsg);
+        }
+        posIterator = value.getFRList().iterator(); // FRList
         while(posIterator.hasNext()){
             destVertexId.set(posIterator.next());
             sendMsg(destVertexId, outgoingMsg);
@@ -111,7 +122,12 @@
      * head send message to all previous nodes
      */
     public void sendMsgToAllPreviousNodes(ValueStateWritable value) {
-        posIterator = value.getIncomingList().iterator();
+        posIterator = value.getRFList().iterator(); // RFList
+        while(posIterator.hasNext()){
+            destVertexId.set(posIterator.next());
+            sendMsg(destVertexId, outgoingMsg);
+        }
+        posIterator = value.getRRList().iterator(); // RRList
         while(posIterator.hasNext()){
             destVertexId.set(posIterator.next());
             sendMsg(destVertexId, outgoingMsg);
diff --git a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/util/VertexUtil.java b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/util/VertexUtil.java
index f2a61be..1740744 100644
--- a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/util/VertexUtil.java
+++ b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/util/VertexUtil.java
@@ -10,9 +10,7 @@
      * @param vertexValue
      */
     public static boolean isPathVertex(ValueStateWritable value) {
-        if (value.inDegree() == 1 && value.outDegree() == 1)
-            return true;
-        return false;
+        return value.inDegree() == 1 && value.outDegree() == 1;
     }
 
     /**
@@ -21,9 +19,7 @@
      * @param vertexValue
      */
     public static boolean isHeadVertex(ValueStateWritable value) {
-        if (value.outDegree() > 0 && !isPathVertex(value))
-            return true;
-        return false;
+        return value.outDegree() > 0 && !isPathVertex(value);
     }
 
     /**
@@ -32,9 +28,7 @@
      * @param vertexValue
      */
     public static boolean isRearVertex(ValueStateWritable value) {
-        if (value.inDegree() > 0 && !isPathVertex(value))
-            return true;
-        return false;
+        return value.inDegree() > 0 && !isPathVertex(value);
     }
 
     /**
@@ -42,9 +36,7 @@
      */
     public static boolean isCycle(KmerBytesWritable kmer, KmerBytesWritable mergeChain, int kmerSize) {
         String chain = mergeChain.toString().substring(1);
-        if (chain.contains(kmer.toString()))
-            return true;
-        return false;
+        return chain.contains(kmer.toString());
 
         /*subKmer.set(vertexId);
         for(int istart = 1; istart < mergeChain.getKmerLength() - kmerSize + 1; istart++){
