import scala.io.StdIn.{readInt, readLine};
import scala.collection.mutable.PriorityQueue;

object Main {
    def main(args: Array[String]): Unit = {
        val size = readInt;
        val graph = new Array[List[(Int, Int)]](size); // (cost, index)
        for (i <- (0 until size)) {
            graph(i) = readLine.trim.split(" ").map(_.toInt).zipWithIndex.filter(_._1 != -1).toList;
        }
        println(mst(size, graph).sum);
    }
    def mst(size: Int, graph: Array[List[(Int, Int)]]): Array[Int] = {
        val dist = new Array[Int](size).map(a => Int.MaxValue);
        val stat = new Array[Int](size); // 0: 未調査, 1: 調査済み
        val pq = new PriorityQueue[(Int, Int)]()(Ordering.by((e: (Int, Int)) => e._1).reverse);
        def go(): Unit = {
            if (!pq.isEmpty) {
                val (cost, idx) = pq.dequeue();
                if (stat(idx) != 1) {
                    dist(idx) = cost;
                    stat(idx) = 1;
                    graph(idx).filter(e => stat(e._2) == 0 && e._1 < dist(e._2)).foreach {e => pq.enqueue(e)}
                }
                go();
            }
        }
        pq.enqueue((0, 0));
        go();
        dist;
    }
}
