We present new algorithms for listing triangles in dense and sparse graphs. The running time of our algorithm for dense graphs is Õ(n ω + n3(ω-1)/(5-ω)t 2(3-ω)/(5-ω)), and the running time of the algorithm for sparse graphs is Õ(m2ω/(ω+1) + m 3(ω-1)/(ω+1)t(3-ω)/(ω+1)), where n is the number of vertices, m is the number of edges, t is the number of triangles to be listed, and ω < 2.373 is the exponent of fast matrix multiplication. With the current bound on ω, the running times of our algorithms are Õ(n2.373 + n1.568 t0.478) and Õ(m1.408 + m1.222 t0.186), respectively. We first obtain randomized algorithms with the desired running times and then derandomize them using sparse recovery techniques. If ω = 2, the running times of the algorithms become Õ(n2 + nt 2/3) and Õ(m4/3 + mt1/3), respectively. In particular, if ω = 2, our algorithm lists m triangles in Õ(m 4/3) time. Pǎtraşcu (STOC 2010) showed that Ω(m4/3-o(1)) time is required for listing m triangles, unless there exist subquadratic algorithms for 3SUM. We show that unless one can solve quadratic equation systems over a finite field significantly faster than the brute force algorithm, our triangle listing runtime bounds are tight assuming ω = 2, also for graphs with more triangles.