You are given a connected weighted undirected graph without any loops and multiple edges. 

Let us remind you that a graph's spanning tree is defined as an acyclic connected subgraph of the given graph that includes all of the graph's vertexes. The weight of a tree is defined as the sum of weights of the edges that the given tree contains. The minimum spanning tree (MST) of a graph is defined as the graph's spanning tree having the minimum possible weight. For any connected graph obviously exists the minimum spanning tree, but in the general case, a graph's minimum spanning tree is not unique.

Your task is to determine the following for each edge of the given graph: whether it is either included in any MST, or included at least in one MST, or not included in any MST.

Input

The first line contains two integers n and m (2 ≤ n ≤ 105, <image>) — the number of the graph's vertexes and edges, correspondingly. Then follow m lines, each of them contains three integers — the description of the graph's edges as "ai bi wi" (1 ≤ ai, bi ≤ n, 1 ≤ wi ≤ 106, ai ≠ bi), where ai and bi are the numbers of vertexes connected by the i-th edge, wi is the edge's weight. It is guaranteed that the graph is connected and doesn't contain loops or multiple edges.

Output

Print m lines — the answers for all edges. If the i-th edge is included in any MST, print "any"; if the i-th edge is included at least in one MST, print "at least one"; if the i-th edge isn't included in any MST, print "none". Print the answers for the edges in the order in which the edges are specified in the input.

Examples

Input

4 5
1 2 101
1 3 100
2 3 2
2 4 2
3 4 1


Output

none
any
at least one
at least one
any


Input

3 3
1 2 1
2 3 1
1 3 2


Output

any
any
none


Input

3 3
1 2 1
2 3 1
1 3 1


Output

at least one
at least one
at least one

Note

In the second sample the MST is unique for the given graph: it contains two first edges.

In the third sample any two edges form the MST for the given graph. That means that each edge is included at least in one MST.
#include <bits/stdc++.h>
using namespace std;
const int Maxn = 100005;
const int Maxm = 100005;
const int Maxw = 1000000;
int n, m;
int p[Maxn], siz[Maxn];
vector<int> neigh[Maxn], id[Maxn];
set<int> A;
int cur, mn[Maxn];
int a[Maxm], b[Maxm], w[Maxm];
int s[Maxm];
int res[Maxm];
bool Less(const int &a, const int &b) { return w[a] < w[b]; }
int getPar(int x) { return p[x] == x ? x : p[x] = getPar(p[x]); }
void findBridges(int v, int p, int ind) {
  if (mn[v]) return;
  int st = ++cur;
  mn[v] = st;
  for (int i = 0; i < neigh[v].size(); i++) {
    int u = neigh[v][i];
    if (u == p && id[v][i] == ind) continue;
    findBridges(u, v, id[v][i]);
    mn[v] = min(mn[v], mn[u]);
  }
  if (p && mn[v] == st) res[ind] = 1;
}
int main() {
  scanf("%d %d", &n, &m);
  for (int i = 0; i < m; i++) {
    scanf("%d %d %d", &a[i], &b[i], &w[i]);
    s[i] = i;
  }
  for (int i = 1; i <= n; i++) {
    p[i] = i;
    siz[i] = 1;
  }
  sort(s, s + m, Less);
  int j = 0;
  for (int i = 1; i <= Maxw; i++) {
    while (j < m && w[s[j]] < i) j++;
    if (j == m || w[s[j]] > i) continue;
    A.clear();
    for (int l = j; l < m && w[s[l]] == i; l++) {
      int e = s[l];
      int pa = getPar(a[e]), pb = getPar(b[e]);
      if (pa == pb)
        res[s[l]] = -1;
      else {
        if (A.find(pa) == A.end()) {
          neigh[pa].clear();
          id[pa].clear();
          A.insert(pa);
          mn[pa] = 0;
        }
        if (A.find(pb) == A.end()) {
          neigh[pb].clear();
          id[pb].clear();
          A.insert(pb);
          mn[pb] = 0;
        }
        neigh[pa].push_back(pb);
        id[pa].push_back(e);
        neigh[pb].push_back(pa);
        id[pb].push_back(e);
      }
    }
    cur = 0;
    if (!A.empty())
      for (set<int>::iterator it = A.begin(); it != A.end(); it++)
        findBridges(*it, 0, -1);
    for (int l = j; l < m && w[s[l]] == i; l++) {
      int e = s[l];
      int pa = getPar(a[e]), pb = getPar(b[e]);
      if (pa != pb)
        if (siz[pa] > siz[pb]) {
          p[pb] = pa;
          siz[pa] += siz[pb];
        } else {
          p[pa] = pb;
          siz[pb] += siz[pa];
        }
    }
  }
  for (int i = 0; i < m; i++)
    if (res[i] > 0)
      printf("any\n");
    else if (res[i] == 0)
      printf("at least one\n");
    else
      printf("none\n");
  return 0;
}
