A crash in the final 500 metres of the race split the peloton, leaving many sprinters like Fernando Gaviria and Tom Boonen (Quick-Step Floors) out of contention for the win.
Team Sky put in the best lead out for their sprinter Elia Viviani on the winding and slightly undulating run to the finish with the Italian launching his effort for the line first.
He wasn't able to do anything about the power of world champion Sagan though, who roared out of the bunch behind Viviani and left him over a bike length behind as he took his first WorldTour win of the season.
Sagan had complained of illness earlier this week, abandoning Strade Bianche last weekend, but appears to be back on top form as he builds towards the spring Classics.
BMC's Rohan Dennis took over the lead in the overall rankings, finishing ahead of his teammate Greg Van Avermaet who wore the leader's blue jersey into the stage start.
The stage's main activity had been dominated by Alexis Gougeard (Ag2r La Mondiale), Mattia Frapporti (Androni Giocattoli), Andrei Grivko (Astana), Mirco Maestri (Bardiani-CSF), Luca Wackermann (Bardiani-CSF), Luri Filosi and Kohei Uchima (Nippo-Vini Fantini), who formed the early break of the day and established a maximum 3-00 gap.
As the sprinters teams began to work a bit harder in the bunch, just Gougeard, Grivko and Filosi remained with around 35km to go.
Things broke up further and Folosi dangled out on his own with around 10 seconds on the bunch with 21km to go, before getting caught close to 19km remaining, with a sprint finish setup.
Sagan and the other sprinters will need to wait a bit longer for another chance at victory though, as the race heads into its queen stage on Saturday with a 171km ride to the summit finish on the Terminillo.
Tirreno-Adriatico 2017 stage three, Monterotondo Marittimo - Montalto di Castro (204k)
1. Peter Sagan (Svk) Bora-Hansgrohe, in 4-51-59
2. Elia Viviani (Ita) Team Sky
3. Jurgen Roelandts (Bel) Lotto Soudal
4. Sacha Modolo (Ita) Team UAE Emirates
5. Luka Mezgec (Slo) Orica-Scott
6. Rick Zabel (Ger) Katusha-Alpecin
7. Andrea Palini (Ita) Androni Giocattoli
8. Roberto Ferrari (Ita) Team UAE Emirates
9. Georg Preidler (Aut) Team Sunweb
10. Ramon Sinkeldam (Ned) Team Sunweb
General Classfication after stage three
1. Rohan Dennis (Aus) BMC Racing Team, in 11-07-13
2. Greg Van Avermaet (Bel) BMC Racing Team
3. Damiano Caruso (Ita) BMC Racing Team
Thank you for reading 5 articles this month* Join now for unlimited access
Enjoy your first month for just £1 / $1 / €1
*Read 5 free articles per month without a subscription
Join now for unlimited access
Try first month for just £1 / $1 / €1