#include <vector>
#include <iostream>
#include <set>

using namespace std;

// struct Solver {
// 	int n;
// 	g

// n! --> (2^n * n) * (n + set)
// set<pair<int, vector<int>>> mem;
set<pair<int, int>> mem; // O(1)
// int mem[N][1 << N]; // O(1)

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

void go(int n, vector<vector<int>> &g, int v, int used, vector<int> &path) {
	// used[v] = 1;
	used ^= 1 << v;
	path.push_back(v);

	if ((int)path.size() == n) {
		// =)
		return;
	}
	if (mem.count({v, used}))
		return;
	mem.insert({v, used});
	// <v, used>

	for (int x : g[v])
		if (bit(x, 0))
			go(n, g, x, used, path);
	path.pop_back();
	// used[v] = 0;
	used ^= 1 << v;
}

int main() {
	int n;
	// ...
	vector<vector<int>> g(n);
	// ...
	vector<int> path;
	// function<void(int, ...)> go = ...
	for (int start = 0; start < n; start++)
		go(n, g, start, 0, path);
}