import scala.collection.mutable.ListBuffer

object Main {

  def main(args: Array[String]): Unit = {
    val sc = new java.util.Scanner(System.in)

    val Vs, Es = sc.nextInt()
    val E = Array.fill[Boolean](Vs, Vs)(false)
    (0 until Es) foreach { _ =>
      val u, v = sc.nextInt()
      E(u)(v) = true
    }
    val visited = new Array[Boolean](Vs)

    val topologicalSorted = new ListBuffer[Int]()
    // 全ての頂点からスタートし, uから繋がっている全てのvについて探索, 帰ってくるタイミングで
    def dfs(u: Int): Unit =
      if (!visited(u)) { // 訪れていない時
        visited(u) = true // 訪れた.
        (0 until Vs) foreach { v => // 全ての頂点について
          if (E(u)(v)) { // 辺が繋がっているv
            dfs(v) // vについてdfs
          } // 辺が繋がっていない頂点には移動しない.
        }
        topologicalSorted.prepend(u)
      } // 訪れているなら何もしない.

    (0 until Vs) foreach dfs

    topologicalSorted.foreach(println)
  }
}

