public Edge getEdgeWhichCompletesCell(int x, int y) {
		checkPositionIndex(x, getCellCountX());
		checkPositionIndex(y, getCellCountY());
		
		if(!isCellCompleted(x, y))
			throw new NoSuchElementException("The cell is not completed.");
		
		final EdgeData top = requireEdgeData(x, y, Direction.RIGHT),
				 left = requireEdgeData(x, y, Direction.BELOW),
				 bottom = requireEdgeData(x, y + 1, Direction.RIGHT),
				 right = requireEdgeData(x + 1, y, Direction.BELOW);
		
		EdgeData oldest = max(max(top, left), max(bottom, right));
		
		if(oldest == top)
			return Edge.obtain(x, y, Direction.RIGHT);
		else if(oldest == left)
			return Edge.obtain(x, y, Direction.BELOW);
		else if(oldest == bottom)
			return Edge.obtain(x, y + 1, Direction.RIGHT);
		else // right
			return Edge.obtain(x + 1, y, Direction.BELOW);
	}