#include<iostream>
#include<algorithm>
#include<queue>
#include<vector>
#include<functional>
using namespace std;
class Edge
{
public:
int v, w;
int weight;
Edge(int v_1, int w_1, int weight_1)
{
v = v_1;
w = w_1;
weight = weight_1;
}
int either()
{
return v;
}
int other(int vertex)
{
if (vertex == v)
return w;
else
return v;
}
bool operator < (const Edge& e) const
{
return weight > e.weight;
}
};
const int N = 55;
vector<Edge> vec[N];
bool maked[N];
int v,e;
int ans = 0;
priority_queue<Edge> pq;
void visit(int v)
{
maked[v] = true;
for (Edge e : vec[v])
{
if (!maked[e.other(v)])
pq.push(e);
}
}
void Prim()
{
visit(0);
while (!pq.empty())
{
Edge e = pq.top();
pq.pop();
int v = e.either(), w = e.other(v);
if (maked[v] && maked[w])
continue;
ans += e.weight;
if (!maked[w])
visit(w);
if (!maked[v])
visit(v);
}
}
int main()
{
cin >> v;
e = v;
for (int i = 0; i < v; i++)
{
for (int j = 0; j < v; j++)
{
int a;
cin >> a;
if (a != 0)
{
Edge e(i, j, a);
vec[i].push_back(e);
vec[j].push_back(e);
}
}
}
Prim();
cout << ans << endl;
return 0;
}