Egan Bernal retained his advantage in the Giro d’Italia after finishing second in Saturday’s penultimate stage to move within reach of the title.
Damiano Caruso, who is second in the overall standings, won the 163km mountain stage from Valle Spluga to Alpe Motta.
But the Ineos Grenadiers rider finished 24 seconds back to give him an overall lead of one minute and 59 seconds.
Sunday sees a 30.3km individual time-trial to Milan’s Duomo cathedral.
Britain’s Simon Yates, who won Friday’s stage 19 to close the gap on the leading two, finished in sixth, 51 seconds behind Caruso and is now over three minutes back.
Victory on the 20th stage was home favourite Caruso’s first win on a Grand Tour.
The Bahrain Victorious rider and Frenchman Roman Bardet pulled clear with five kilometres to go and it was Caruso who dug deep for the win as Bardet dropped back.
Bernal, the pink jersey holder, stayed at the head of the peloton for much of the race, keeping the gap between him and the race leaders a manageable one going into the final stages.
“I’m satisfied with the result,” said the Colombian. “I think we managed well the situation finally. We have two minutes of an advantage for tomorrow’s time trial so I think we are in a good position.
“It’s not the best to have the rider second in GC [general classification] in front you by almost one minute but having three team-mates, I tried to use them to arrive as fresh as possible into the last climb and also tomorrow.
“I think we did well but it was difficult to manage the situation.”
Stage 20 results
1. Damiano Caruso (Ita/Bahrain Victorious) 4hrs 27mins 53secs
2. Egan Bernal (Col/Ineos Grenadiers) +24secs
3. Daniel Martínez (Col/INEOS Grenadiers) +35secs
4. Romain Bardet (Fra/Team DSM) same time
5. João Almeida (Por/Deceuninck – Quick-Step) +41secs
6. Simon Yates (GB/Team BikeExchange) +51secs
7. Aleksandr Vlasov (Rus/Astana – Premier Tech) +1min 13secs
8. Hugh Carthy (GB/EF Education – Nippo) +1:29
9. Lorenzo Fortunato (Ita/EOLO – Kometa Cycling Team) +2:07
10. Antonio Pedrero (Spa/Movistar Team) +2:23
General classification
1. Egan Bernal (Col/Ineos Grenadiers) 85hrs 41mins 47secs
2. Damiano Caruso (Ita/Bahrain Victorious) +1min 59secs
3. Simon Yates (GB/Team BikeExchange) +3:23
4. Aleksandr Vlasov (Rus/Astana – Premier Tech) +7:07
5. Romain Bardet (Fra/Team DSM) +7:48
6. Daniel Martínez (Col/INEOS Grenadiers) +7:56
7. Hugh Carthy (GB/EF Education – Nippo) +8:22
8. João Almeida (Por-Deceuninck – Quick-Step) +8:50
9. Tobias Foss (Nor/Jumbo – Visma) +12:39
10. Daniel Martin (Irl/Israel Start-Up Nation) +16:48