Program: 39718
Project: 39718
Buggy source:
private boolean addRandomEdges(Node[] nodes,Edges edges,int toAdd){
  ArrayList<Node> listDst=new ArrayList<Node>();
  ArrayList<Node> listSrc=new ArrayList<Node>();
  for (int i=0; i < DEGREE; i++) {
    listDst.addAll(Arrays.asList(nodes));
    listSrc.addAll(Arrays.asList(nodes));
  }
  Random rand=new Random();
  int retries=30;
  while (!listSrc.isEmpty() && !listDst.isEmpty() && retries > 0) {
    int srcId=rand.nextInt();
    srcId=(srcId < 0) ? srcId * (-1) : srcId;
    srcId=srcId % listSrc.size();
    Node srcN=listSrc.get(srcId);
    int src=srcN.getIndex();
    int dstId=rand.nextInt();
    dstId=(dstId < 0) ? dstId * (-1) : dstId;
    dstId=dstId % listDst.size();
    Node dstN=listDst.get(dstId);
    int dst=dstN.getIndex();
    if (src == dst) {
      System.err.println("String_Node_Str" + src + "String_Node_Str"+ dst);
      try {
        Thread.sleep(500);
      }
 catch (      InterruptedException ex) {
        Thread.currentThread().interrupt();
      }
      retries--;
      continue;
    }
    if (this.BIDIRECTIONAL) {
      edges.add(src,dst);
      edges.add(dst,src);
      listSrc.remove(srcN);
      listDst.remove(srcN);
      listDst.remove(dstN);
      listSrc.remove(dstN);
    }
 else {
      edges.add(src,dst);
      listSrc.remove(srcN);
      listDst.remove(dstN);
    }
    retries=30;
  }
  if (edges.size() != toAdd) {
    System.err.println("String_Node_Str" + "String_Node_Str" + edges.size() + "String_Node_Str"+ toAdd+ "String_Node_Str");
    edges=null;
    edges=new Edges(nodes,toAdd);
    return addRandomEdges(nodes,edges,toAdd);
  }
  return true;
}

Fixed version (ground truth):
private boolean addRandomEdges(Node[] nodes,Edges edges,int toAdd){
  ArrayList<Node> listDst=new ArrayList<Node>();
  ArrayList<Node> listSrc=new ArrayList<Node>();
  for (int i=0; i < DEGREE; i++) {
    listDst.addAll(Arrays.asList(nodes));
    listSrc.addAll(Arrays.asList(nodes));
  }
  Random rand=new Random();
  int retries=30;
  while (!listSrc.isEmpty() && !listDst.isEmpty() && retries > 0) {
    int srcId=rand.nextInt();
    srcId=(srcId < 0) ? srcId * (-1) : srcId;
    srcId=srcId % listSrc.size();
    Node srcN=listSrc.get(srcId);
    int src=srcN.getIndex();
    int dstId=rand.nextInt();
    dstId=(dstId < 0) ? dstId * (-1) : dstId;
    dstId=dstId % listDst.size();
    Node dstN=listDst.get(dstId);
    int dst=dstN.getIndex();
    while ((src == dst || edges.contains(src,dst)) && retries > 0) {
      System.err.println("String_Node_Str" + src + "String_Node_Str"+ dst);
      try {
        Thread.sleep(500);
      }
 catch (      InterruptedException ex) {
        Thread.currentThread().interrupt();
      }
      dstId=(dstId + 1) % listDst.size();
      dstN=listDst.get(dstId);
      dst=dstN.getIndex();
      retries--;
      continue;
    }
    if (retries == 0) {
      System.err.println("String_Node_Str" + "String_Node_Str" + edges.size() + "String_Node_Str"+ toAdd+ "String_Node_Str");
      edges=null;
      edges=new Edges(nodes,toAdd);
      return addRandomEdges(nodes,edges,toAdd);
    }
    if (this.BIDIRECTIONAL) {
      edges.add(src,dst);
      edges.add(dst,src);
      listSrc.remove(srcN);
      listDst.remove(srcN);
      listDst.remove(dstN);
      listSrc.remove(dstN);
    }
 else {
      edges.add(src,dst);
      listSrc.remove(srcN);
      listDst.remove(dstN);
    }
    retries=30;
  }
  return true;
}