Denmark’s Jonas Vingegaard sealed his second successive Tour de France triumph as Jordi Meeus sprinted to a surprise win on the final stage.
Meeus, 25, edged Jasper Philipsen in a photo finish in Paris to deny his fellow Belgian a repeat of last year’s win on the iconic Champs Elysees.
Vingegaard, 26, finished seven minutes and 29 seconds clear of nearest rival, two-time winner Tadej Pogacar.
Britain’s Adam Yates was third overall, one place above his twin brother Simon.
“I’m happy of course – we’re winning it for the second time and it’s amazing,” said Vingegaard.
“It’s been a super hard race and a super good fight between me and Tadej. Of course, I hope to come back next year to see if I can take the third win.”
Only eight men have taken three or more Tour wins since the race’s first edition in 1903.
Vingegaard’s more immediate target is victory at another Grand Tour, the Vuelta a Espana, which starts at the end of August.
He will ride alongside his Jumbo-Visma team-mate and three-time Vuelta winner Primoz Roglic – winner of this year’s Giro d’Italia – as they target a first clean sweep of the sport’s three biggest stage races.
Vingegaard revealed he will take no more than a week off before starting his preparations for Spain, but will find time to celebrate his success.
“It’s been an amazing year, what a Tour de France for us,” he added.
“We started the plans early and once again I could not have done it without my team. I’m so proud of every one of us.
“Tonight we will celebrate, have a good dinner, it will be a nice evening. Thanks to my opponents who have been amazing, it’s been an amazing three weeks fighting with you guys.”
Meeus was probably the most unlikely man to make it to the top of the podium in the French capital.
Racing in his first Tour, Bora-Hansgrohe rider Meeus claimed the biggest win of his career by a rim from Philipsen, racing in the green jersey having won four stages of this year’s contest.
Meeus said: “It was a super nice experience already so far and to take the win today was an indescribable feeling. Everything went perfect.”
How the 2023 Tour was won
Vingegaard ended up a comfortable winner over Pogacar but his decisive move did not come until more than a fortnight into the Tour.
Only 10 seconds separated the pair after 15 stages but the Dane took total control of the race when it entered the Alps in the final week.
He extended that lead to almost two minutes with a superb ride in the individual time trial on Tuesday and then finished off Pogacar’s challenge on Wednesday’s queen stage, the toughest day of the race.
Pogacar, whose preparations were hit by a broken wrist when he crashed in April, cracked with 15km left of the final climb and told his team radio: “I’m gone, I’m dead.”
Vingegaard, who took the leader’s yellow jersey after the sixth stage, powered on to open a gap of more than seven minutes by the finish – and knew then that the Tour was won.
Italy’s Giulio Ciccone won the king of the mountains prize for best climber, while Philipsen took the green jersey for winning the points category.
Philipsen also won four stages, one of them narrowly from Mark Cavendish on stage seven to deny the Manxman the victory he needed to break the all-time record for Tour stage wins.
The 38-year-old Cavendish, who had already said he intends to retire at the end of this season, crashed out the following day, meaning he still shares the record of 34 wins with Belgian legend Eddy Merckx.
Stage 21 results
1. Jordi Meeus (Bel/Bora-Hansgrohe) 2hrs 56mins 13secs
2. Jasper Philipsen (Bel/Alpecin-Deceuninck) Same time
3. Dylan Groenewegen (Ned/Team Jayco-AlUla)
4. Mads Pedersen (Den/Lidl-Trek)
5. Cees Bol (Ned/Astana-Qazaqstan)
6. Biniam Girmay (Eri/Intermarche-Circus-Wanty)
7. Bryan Coquard (Fra/Cofidis)
8. Soren Warenskjold (Nor/Uno-X Pro Cycling)
9. Corbin Strong (NZ/Israel-Premier Tech)
10. Luca Mozzato (Ita/Arkea-Samsic)
Final general classification standings
1. Jonas Vingegaard (Den/Jumbo-Visma) 82hrs 5mins 42secs
2. Tadej Pogacar (Slo/UAE Team Emirates) +7mins 29secs
3. Adam Yates (GB/UAE Team Emirates) +10mins 56secs
4. Simon Yates (GB/Team Jayco-AlUla) +12mins 23secs
5. Carlos Rodriguez (Spa/Ineos Grenadiers) +13mins 17secs
6. Pello Bilbao (Spa/Bahrain Victorious) +13mins 27secs
7. Jai Hindley (Aus/Bora-Hansgrohe) +14mins 44secs
8. Felix Gall (Aut/AG2R-Citroen) +16mins 9secs
9. David Gaudu (Fra/Groupama-FDJ) +23mins 8secs
10. Guillaume Martin (Fra/Cofidis) +26mins 30secs