#include <vector>
#include <iostream>

using namespace std;

const int N = 20;

int bit(int x, int i) {
	return (x >> i) & 1;
}

// f[v][used]
bool f[N][1 << N]; // 0
int p[N][1 << N]; // p[x][mask ^ (1 << x)] = v

int main() {
	int n;
	// ...
	vector<vector<pair<int, int>>> g(n);
	// ...

	for (int start = 0; start < n; start++)
		f[start][1 << start] = 1; // =0
	// f[0][1 << 0] = 1;
	for (int mask = 0; mask < (1 << n); mask++) // used
		for (int v = 0; v < n; v++)
			if (f[v][mask] == 1) // !=+INF
				for (auto [x, w] : g[v]) {
					// if (f[v][mask]+w < f[x][mask ^ (1 << x)])
					f[x][mask ^ (1 << x)] = 1; // min= f[v][mask]+w
					p[x][mask ^ (1 << x)] = v;
				}
	// 1000000000
	// 0111111111
	int mask = (1 << n) - 1;
	for (int end = 0; end < n; end++)
		if (f[end][mask] == 1) { // end ---> 0
			// [end,mask]
			while (mask > 0) {
				path.push_back(end);
				int v = p[end][mask];
				mask ^= 1 << end;
				end = v;
			}
			break;
		}
}