/* Marek Cygan
 * 24.02.2011
 * zadanie Wzorzec
 * rozwiazanie przez programowanie dynamiczne + szybkie spradzanie rownosci przez hasze*/

#include <cstring>
#include <cstdio>
#include <algorithm>
#include <vector>
using namespace std;

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

const long long P = 123532345133LL;

const int N = 110;
const int M = 101000;
int vis[M][N];
long long hasze[M];
long long potegi[M];

vector<pair<int, pair<int, int> > > kraw[N];

void inicjuj_hasze(char *txt){
  int m = strlen(txt);
  hasze[m] = 0;
  for (int i=m-1; i>=0; i--) hasze[i] = hasze[i+1] * P + txt[i];
  potegi[0] = 1;
  for (int i=1; i<=m; i++) potegi[i] = potegi[i-1] * P;
}

int daj_hasz(int a,int d){
  return hasze[a] - hasze[a+d] * potegi[d];
}

int main(){
  int n,m;
  scanf("%d %d",&n,&m);
  for (int i=0; i<m; i++){
    int a,b;
    char txt[M];
    scanf("%d %d %s",&a,&b,txt);
    a--; b--;
    inicjuj_hasze(txt);
    kraw[a].push_back(make_pair(b, make_pair(strlen(txt), daj_hasz(0,strlen(txt)))));
  }
  char txt[M];
  scanf("%s",txt);
  inicjuj_hasze(txt);
  m = strlen(txt);
  for (int i=0; i<n; i++) vis[0][i] = 1;
  for (int j=0; j<m; j++) for (int i=0; i<n; i++) if (vis[j][i]){
    FOREACH(it, kraw[i]){
      int d = it->second.first;
      int h = it->second.second;
      if (j + d <= m && h == daj_hasz(j,d)) vis[j+d][it->first] = 1;
    }
  }

  for (int i=0; i<n; i++) if (vis[m][i]){
    puts("TAK");
    return 0;
  } 
  puts("NIE");
  return 0;
}
