#include <bits/stdc++.h>
#pragma GCC optimize("Ofast")
#pragma GCC optimize("fast-math")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
#pragma GCC optimization("unroll-loops")
#pragma GCC optimization("O3")
using namespace std;
const int N = 1e6 + 10, LOG = 26, M = 1e5;
vector<vector<pair<int, pair<int, int>>>> edge;
vector<vector<int>> graph;
int U[N];
int V[N];
bool isce[N];
int tme, vis[N], arr[N], sz[N], par[N], value[N];
int findPar(int v) {
  if (v == par[v]) return v;
  return par[v] = findPar(par[v]);
}
void merge(int a, int b) {
  a = findPar(a);
  b = findPar(b);
  if (a != b) {
    if (sz[a] < sz[b]) swap(a, b);
    par[b] = a;
    sz[a] += sz[b];
  }
}
int adj(int u, int e) { return U[e] == u ? V[e] : U[e]; }
int dfs(int u, int edge) {
  vis[u] = 1;
  arr[u] = tme++;
  int dbe = arr[u];
  for (auto e : graph[u]) {
    int w = adj(u, e);
    if (!vis[w])
      dbe = min(dbe, dfs(w, e));
    else if (e != edge)
      dbe = min(dbe, arr[w]);
  }
  if (dbe == arr[u] && edge != -1) isce[edge] = 1;
  return dbe;
}
int main() {
  ios::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  int n, m;
  cin >> n >> m;
  for (int i = 1; i <= n; i++) par[i] = i, sz[i] = 1;
  edge.resize(N);
  for (int i = 0; i < m; i++) {
    int u, v, w;
    cin >> u >> v >> w;
    edge[w].push_back({i, {u, v}});
  }
  for (int i = 1; i < N; i++) {
    if (edge[i].size() == 0) continue;
    set<int> cg;
    set<int> ce;
    for (auto u : edge[i]) {
      if (findPar(u.second.first) == findPar(u.second.second))
        value[u.first] = 2;
      if (value[u.first] != 2) {
        ce.insert(u.first);
        cg.insert(findPar(u.second.second));
        cg.insert(findPar(u.second.first));
      }
    }
    if (cg.size() == 0) continue;
    graph.resize(cg.size());
    map<int, int> mg;
    vector<int> vg;
    map<int, int> me;
    vector<int> ve;
    vg.resize(cg.size());
    ve.resize(ce.size());
    int cnt = 0;
    for (auto it = cg.begin(); it != cg.end(); it++) {
      mg[(*it)] = cnt;
      vg[cnt] = (*it);
      cnt++;
    }
    cnt = 0;
    for (auto it = ce.begin(); it != ce.end(); it++) {
      me[(*it)] = cnt;
      ve[cnt] = (*it);
      cnt++;
    }
    for (auto u : edge[i]) {
      if (value[u.first] == 2) continue;
      graph[mg[par[u.second.first]]].push_back(me[u.first]);
      graph[mg[par[u.second.second]]].push_back(me[u.first]);
      U[me[u.first]] = mg[par[u.second.first]];
      V[me[u.first]] = mg[par[u.second.second]];
    }
    for (int i = 0; i < cg.size(); i++)
      if (!vis[i]) dfs(i, -1);
    for (int k = 0; k < ce.size(); k++)
      if (isce[k] == 1)
        value[ve[k]] = 0;
      else
        value[ve[k]] = 1;
    tme = 0;
    for (int k = 0; k < cg.size(); k++) {
      vis[k] = 0;
      arr[k] = 0;
    }
    graph.clear();
    for (int k = 0; k < ce.size(); k++) {
      isce[k] = 0;
      U[k] = 0;
      V[k] = 0;
    }
    for (auto u : edge[i]) merge(u.second.first, u.second.second);
  }
  for (int i = 0; i < m; i++) {
    if (value[i] == 0) cout << "any\n";
    if (value[i] == 1) cout << "at least one\n";
    if (value[i] == 2) cout << "none\n";
  }
}
