Elia Viviani vandt tredje etape i Tirreno-Adriatico foran Peter Sagan og Fernando Gaviria i en underholdende finale.