I don't understand how those nodes and edges in your model map to the model in modelo.lp. Looking at modelo.lp I see these constraints:
Subject To
c1: x1 + x2 = 1
c2: x3 + x4 = 1
c3: x5 + x6 = 1
All constraint look like this, that is, all constraints are of the form
x[i] + x[i+1]
with all x[i] being binary variables and each variable appearing in at most one constraint.
Looking at the variable x[i] and x[i+1] in a constraint one can see that both variables have the same coefficient in the objective function. Each constraints x[i]+x[i+1]=1 states the requirement "set either x[i] or x[i+1] to 1, but not both". If you now pick an (arbitrary) variable in each constraint and sum up the objective function coefficients for the selected variables then you get 144, not 141. Since the variables in a single constraint have the same coefficient in the objective function, it does not really matter which variable you pick in a constraint.
So CPLEX correctly finds the optimal objective function.
To me it looks like the model you create is not what you want to create. Maybe it is a good idea to assign names to all the x variables:
x[i][j][k] = IloBoolVar(env2);
std::stringstream s;
s << "x#" << i << "'#" << j << "#" << k;
x[i][j][k].setName(s.str().c_str());
run the program again and double check that the constraint in modelo.lp look like expected.
#CPLEXOptimizers#DecisionOptimization