#include <iostream>#include <iostream>
#include <cstdlib>
#include <algorithm>
#include <queue>
#include <deque>
#include <set>
#include <vector>
#include <map>
#include <string>
#include <cstring>
#include <iomanip>
#include <cstdio>
#include <fstream>
#include <sstream>


using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const int inf  = 1000*1000*1000+100;
const int maxn = 200;
const double eps = 1e-7;
int n;
int rem;
double dist[maxn][maxn];
double B;
double l;
int mark[maxn];
vector<int> path;
vector<int> best;

double g(int v)
{
	double ret=0;
	for(int i=0; i < n ; ++i)
	{
		if(!mark[i])
		{
			double mi = inf;
			for(int j=0 ; j < n ; ++j)
				if( (!mark[j]||j==v) && j!=i)
					mi=min(mi,dist[j][i]);
			ret+=mi;
		}
	}

	return ret;
}

void BnB(int v)
{
	if(v==0 ){
		if(mark[v]){
			if(!rem){
				if(l < B){
					best=path;
					B=l;
					cerr << B << endl;
				}
			}
			return;
		}
	}


	if( g(v) > B-eps ){
		return;
	}	

	for(int i = 0 ; i < n ; ++i)
		if(!mark[i])
		{
			rem--;
			mark[i]=true;
			path.push_back(i);
			l+=dist[v][i];

			BnB(i);
			
			l-=dist[v][i];
			path.pop_back();
			mark[i]=false;
			rem++;
		}

}

int main()
{
	ios::sync_with_stdio(false);
	cin >> n;

	for(int i = 0 ; i < n ; ++i){
		for(int j = 0 ; j < n ; ++j){
			cin >> dist[i][j];
		}
	}

	rem = n;
	B=inf;

	BnB(0);
	
	cout << B << " " << (int)(best).size() << endl;
	for(int i = 0 ; i < (int)best.size() ; ++i)
		cout << best[i] << " ";
	cout << endl;

	return 0;
}