OI XX - mor

// https://szkopul.edu.pl/problemset/problem/CfSEK4ACOcAPaAfX29Fp7Tud/site/?key=statement

#include <algorithm>
#include <bitset>
#include <iostream>
#include <queue>
#include <vector>

constexpr int sizik = 5 * 1001, sizik2 = 1000 * 1001;

std::vector<int> kra[sizik];

bool visited[sizik][2];
int values[sizik][2];

void BFS(int v) {
    std::queue<std::pair<int, int>> q;

    q.push({v, 0});
    values[v][0] = 0;

    while (!q.empty()) {
        const auto [u, s] = q.front();
        q.pop();

        if (visited[u][s]) {
            continue;
        }

        visited[u][s] = true;

        for (const auto& w : kra[u]) {
            int local_s = s == 0 ? 1 : 0;

            if (!visited[w][local_s]) {
                q.push({w, local_s});
                values[w][local_s] = values[u][s] + 1;
            }
        }
    }
}

struct Podroz {
    int start, end, nr, d;
    Podroz(int start1, int end1, int nr1, int d1) {
        start = start1;
        end = end1;
        nr = nr1;
        d = d1;
    }
};

bool odp[sizik2];
std::vector<Podroz> podroze;

int main() {
    std::ios_base::sync_with_stdio(0);
    std::cin.tie(0);
    std::cout.tie(0);

    int n, m, k;
    std::cin >> n >> m >> k;

    for (int i = 0; i < m; i++) {
        int a, b;
        std::cin >> a >> b;

        kra[a].push_back(b);
        kra[b].push_back(a);
    }

    for (int i = 1; i <= k; i++) {
        int s, t, d;
        std::cin >> s >> t >> d;

        podroze.push_back({s, t, i, d});
    }

    std::sort(podroze.begin(), podroze.end(), [](const Podroz& p1, const Podroz& p2) { return p1.start < p2.start; });

    int i = 0, prev = -1;
    while (i < podroze.size()) {
        const auto& curr = podroze[i];

        if (curr.start == prev) {
            auto temp = values[curr.end][(int)(curr.d % 2)];

            if (temp == -1) {
                odp[curr.nr] = false;
            } else if (curr.d >= temp && curr.d % 2 == temp % 2) {
                if (temp == 0 && kra[curr.start].size() < 1) {
                    odp[curr.nr] = false;
                } else {
                    odp[curr.nr] = true;
                }
            } else {
                odp[curr.nr] = false;
            }

            i++;
        } else {
            prev = curr.start;

            for (int i = 1; i <= n; i++) {
                values[i][0] = -1;
                values[i][1] = -1;
                visited[i][0] = false;
                visited[i][1] = false;
            }

            BFS(curr.start);
        }
    }

    for (int i = 1; i <= k; i++) {
        if (odp[i]) {
            std::cout << "TAK\n";
        } else {
            std::cout << "NIE\n";
        }
    }

    return 0;
}