/* Marek Cygan
 * zadanie polega na znalezieniu cyklu w grafie skierowanym podanym w postaci skompresowanej
 * zlozonosc: (n+m) log n
 * opis: DFS zaimplementowany z uzyciem seta.
 */
#include <cstdio>
#include <algorithm>
#include <set>
#include <vector>
using namespace std;

#define FOREACH(it, X) for(__typeof((X).begin()) it = (X).begin(); it != (X).end(); ++it)

const int N = 300010;

vector<pair<int, int> > kraw[N];
int vis[N];
int parent[N];
set<int> nieodwiedzone;
set<int> stos;
int n;

void wczytaj(){
  int m;
  scanf("%d %d",&n,&m);
  for (int ii=0; ii<m; ii++){
    int a,b,c;
    scanf("%d %d %d",&a,&b,&c);
    a--; b--; c--;
    kraw[a].push_back(make_pair(b,c));
  }
}

int znajdz(const set<int> &zbior, int a, int b){
  set<int>::iterator it = zbior.lower_bound(a);
  if (it != zbior.end() && *it <= b) return *it;
  return -1;
}

int dfs(int x, int p){
  parent[x] = p; vis[x] = 1;
  stos.insert(x);
  nieodwiedzone.erase(x);

  FOREACH(it, kraw[x]){
    int a = it->first, b = it->second;
    int u = znajdz(stos, a, b);
    if (u != -1){
      puts("TAK");
      return 1;
    }
    while ((u = znajdz(nieodwiedzone, a, b)) != -1){
      if (dfs(u, x)) return 1;
    }
  }

  stos.erase(x);
  vis[x] = 2;
  return 0;
}

void licz(){
  for (int i=0; i<n; i++) nieodwiedzone.insert(i);
  for (int i=0; i<n; i++) if (vis[i]==0){
    if (dfs(i, -1)) return;
  }
  puts("NIE");
}

int main(){
  wczytaj();
  licz();
  return 0;
}
