@Override
	public ArrayList<Road> Reroute(ArrayList<Road> roads, ArrayList<RoadLink> roadLinks) {
		// Create network to reroute in
		System.out.println("Starting rerouting roads");
		System.out.println("- creating network");
		createNetwork(roads, roadLinks);
		System.out.println("- rerouting roads");
		// Reroute all roads in network that meet criteria
		int networkIndex = 0;
		for (Road road : roads) {
			if(road.getStatus() == RoadStatus.Closed || road.getRiskLevel() >= REROUTE_RISK_THRESHOLD){
				RouteLabel bestReroute = null;
				if(road.getStatus() == RoadStatus.Closed){
					System.out.println(String.format(" - Rerouting road %s %s due to being closed", road.getCode(), road.getName()));
					// Find shortest alternate route with any risk level
					bestReroute = labelReroute(networkIndex, networkIndex + roads.size(), Integer.MAX_VALUE);
				} else {
					// Temporarily disable rerouted road
					int status = network[networkIndex][networkIndex+roads.size()][0];
					network[networkIndex][networkIndex+roads.size()][0] = 0;
					// Find shortest alternate route with at most 80% risk*distance of the orignial route
					System.out.println(String.format(" - Rerouting road %s %s due to having above threshold risk", road.getCode(), road.getName()));
					bestReroute = labelReroute(networkIndex, networkIndex + roads.size(),
							(int)((road.getRiskLevel() - 1)*road.getLength()*LabelRerouter.MAX_REROUTE_RISK_DISTANCE_PROPORTION));
					// Reenable rerouted road
					network[networkIndex][networkIndex+roads.size()][0] = status;
				}
				if(bestReroute != null){
					System.out.println(String.format("  - Cost: %d, Riskdistance: %d", bestReroute.getCost(), bestReroute.getRiskDistance()));
					System.out.println("  - Reroute path (repeated name => actual traversal, single => visit of end point ");
					int[] path = bestReroute.getPath();
					for (int i : path) {
						Road pathroad = roads.get(i >= roads.size()? i - roads.size() : i);
						System.out.println(String.format("   - node %d: %s %s", i, pathroad.getCode(), pathroad.getName()));
					}
				} else {
					System.out.println("  - no feasible reroute path found");
				}
			}
			
			networkIndex++;
		}
		return null;
	}