With minrelax=true, Gurobi will first minimize the cost of the violation and then among those solutions with minimal violation return the one that minimizes the original objective. So in your example, it will pick s1 over s2 since the cost of the violation is smaller.