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 long long int N = 1e5 + 105;
set<pair<long long int, long long int> > s;
set<long long int> d;
vector<pair<long long int, long long int> > vs, v[N];
map<pair<long long int, long long int>, long long int> ma;
pair<long long int, long long int> p1, pd, b[N], p[N];
long long int u, n, mo, par[N], xd[N], yd[N], x, y, ans[N], r, w, h[N], m[N];
pair<long long int, long long int> dfs(long long int s, long long int e) {
  long long int y, e2;
  m[s] = 1;
  b[s] = make_pair(h[s], e);
  for (int i = 0; i < v[s].size(); i++) {
    y = v[s][i].first;
    e2 = v[s][i].second;
    if (m[y] == 0) {
      p[y] = make_pair(s, e);
      h[y] = h[s] + 1;
      p1 = dfs(y, e2);
      if (p1.first < b[s].first) b[s] = p1;
    } else if (e != e2 && p[s].first != y) {
      if (h[y] < b[s].first) b[s] = make_pair(h[y], e2);
    } else if (p[s].first == y && e != e2 && b[s].first == h[s]) {
      b[s] = make_pair(h[s], e2);
    }
  }
  if (b[s].first == h[s] && b[s].second == e && e != 0) {
    if (s > p[s].first)
      p1 = make_pair(p[s].first, s);
    else
      p1 = make_pair(s, p[s].first);
    ma[p1] = 1;
  }
  return b[s];
}
long long int getpar(long long int x) {
  if (par[x] < 0) return x;
  return par[x] = getpar(par[x]);
}
int main() {
  cin >> n >> mo;
  fill(par, par + N, -1);
  for (int i = 1; i <= mo; i++) {
    cin >> xd[i] >> yd[i] >> w;
    if (xd[i] > yd[i]) swap(xd[i], yd[i]);
    s.insert({w, i});
  }
  while (!s.empty()) {
    u = 0;
    pd = *s.begin();
    vs.resize(0);
    p1 = *s.begin();
    while (!s.empty() && p1.first == pd.first) {
      vs.push_back(*s.begin());
      s.erase(s.begin());
      if (!s.empty()) p1 = *s.begin();
    }
    for (int i = 0; i < vs.size(); i++) {
      r = vs[i].second;
      x = xd[r];
      y = yd[r];
      x = getpar(x);
      y = getpar(y);
      if (x == y) {
        ans[r] = -1;
        continue;
      }
      v[x].push_back({y, r});
      v[y].push_back({x, r});
      d.insert(x);
      d.insert(y);
    }
    while (!d.empty()) {
      x = *d.begin();
      d.erase(d.begin());
      if (m[x] == 0) {
        h[x] = 0;
        p[x] = {x, 0};
        dfs(x, 0);
      }
      m[x] = 0;
      b[x] = make_pair(0, 0);
      h[x] = 0;
    }
    for (int i = 0; i < vs.size(); i++) {
      r = vs[i].second;
      x = xd[r];
      y = yd[r];
      x = getpar(x);
      y = getpar(y);
      if (ans[r] != -1) {
        if (x > y) swap(x, y);
        p1 = make_pair(x, y);
        if (ma[p1] == 1) {
          ma[p1] = 0;
          ans[r] = 1;
        } else
          ans[r] = 2;
      }
    }
    for (int i = 0; i < vs.size(); i++) {
      r = vs[i].second;
      x = xd[r];
      y = yd[r];
      x = getpar(x);
      y = getpar(y);
      v[x].resize(0);
      v[y].resize(0);
      if (x != y) {
        if (par[x] > par[y]) swap(x, y);
        par[x] += par[y];
        par[y] = x;
      }
    }
  }
  for (int i = 1; i <= mo; i++) {
    if (ans[i] == -1) cout << "none" << '\n';
    if (ans[i] == 2) cout << "at least one" << '\n';
    if (ans[i] == 1) cout << "any" << '\n';
  }
  return 0;
}
