5c66374f90e22608654961d0d97feb13a6dd3fa67d456737cc6028d14631d5f5
// https://szkopul.edu.pl/problemset/problem/eQ4z7Bnhqsl67nKb_NlISLNZ/site/?key=statement
#include <bits/stdc++.h>
const int MAXN = 200005;
struct Edge {
int to;
int id;
};
int n, m;
std::vector<Edge> adj[MAXN];
int vis[MAXN];
int parent_node[MAXN];
int parent_edge[MAXN];
bool found_cycle = false;
int cycle_start = -1, cycle_end = -1, cycle_closing_edge = -1;
int deg[MAXN];
std::vector<int> solution_edges;
void dfs_cycle(int u, int p) {
vis[u] = 1;
for (auto& e : adj[u]) {
int v = e.to;
if (v == p) continue;
if (vis[v] == 1) {
found_cycle = true;
cycle_start = v;
cycle_end = u;
cycle_closing_edge = e.id;
return;
}
if (vis[v] == 0) {
parent_node[v] = u;
parent_edge[v] = e.id;
dfs_cycle(v, u);
if (found_cycle) return;
}
}
vis[u] = 2;
}
void dfs_parity(int u, int p, int edge_from_p) {
vis[u] = 1;
for (auto& e : adj[u]) {
int v = e.to;
if (v != p) {
dfs_parity(v, u, e.id);
}
}
if (deg[u] % 2 == 0) {
if (p != -1) {
deg[u]++;
deg[p]++;
solution_edges.push_back(edge_from_p);
}
}
}
int main() {
std::ios_base::sync_with_stdio(0);
std::cin.tie(0);
std::cout.tie(0);
std::cin >> n >> m;
for (int i = 1; i <= m; ++i) {
int r, c;
std::cin >> r >> c;
int u = r;
int v = n + c;
adj[u].push_back({v, i});
adj[v].push_back({u, i});
}
std::fill(vis, vis + 2 * n + 1, 0);
for (int i = 1; i <= 2 * n; ++i) {
if (!vis[i]) {
dfs_cycle(i, -1);
if (found_cycle) break;
}
}
if (found_cycle) {
std::cout << "TAK\n";
std::vector<int> cycle_path;
cycle_path.push_back(cycle_closing_edge);
int curr = cycle_end;
while (curr != cycle_start) {
cycle_path.push_back(parent_edge[curr]);
curr = parent_node[curr];
}
std::cout << cycle_path.size() << "\n";
for (int i = 0; i < cycle_path.size(); ++i) {
std::cout << cycle_path[i] << (i == cycle_path.size() - 1 ? "" : " ");
}
std::cout << "\n";
return 0;
}
std::fill(vis, vis + 2 * n + 1, 0);
std::fill(deg, deg + 2 * n + 1, 0);
solution_edges.clear();
for (int i = 1; i <= 2 * n; ++i) {
if (!vis[i]) {
dfs_parity(i, -1, -1);
}
}
bool ok = true;
if (solution_edges.empty()) ok = false;
for (int i = 1; i <= 2 * n; ++i) {
if (deg[i] % 2 == 0) {
ok = false;
break;
}
}
if (ok) {
std::cout << "TAK\n";
std::cout << solution_edges.size() << "\n";
for (int i = 0; i < solution_edges.size(); ++i) {
std::cout << solution_edges[i] << (i == solution_edges.size() - 1 ? "" : " ");
}
std::cout << "\n";
} else {
std::cout << "NIE\n";
}
return 0;
}