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;
long long int ceil_div(long long int a, long long int b) {
  return (a + b - 1) / b;
}
const long long int N = 1e6 + 5, INF = 1e15, MOD = 1e9 + 7;
std::vector<pair<long long int, long long int> > v[N];
std::vector<pair<pair<long long int, long long int>,
                 pair<long long int, long long int> > >
    e;
long long int ans[N], sz[N], p[N], ns, dp[N], h[N];
bool ch[N];
int get_r(int u) {
  assert(p[u] != u);
  return (p[u] < 0) ? u : p[u] = get_r(p[u]);
}
long long int siz(int u, int pp) {
  long long int ans = -p[u];
  ch[u] = true;
  for (auto w : v[u])
    if (w.first != pp) ans += siz(w.first, u);
  return ans;
}
void dfs(int u, int pp) {
  h[u] = h[pp] + 1;
  dp[u] = N;
  ch[u] = true;
  int tt = 0;
  for (auto w : v[u]) {
    if (w.first == pp && !tt) {
      tt++;
      continue;
    }
    if (!ch[w.first]) {
      dfs(w.first, u);
      dp[u] = min(dp[u], dp[w.first]);
    } else {
      dp[u] = min(h[w.first], dp[u]);
      ans[w.second] = 1;
      continue;
    }
    if (dp[w.first] < h[w.first])
      ans[w.second] = 1;
    else
      ans[w.second] = 2;
  }
}
int main() {
  long long int n, m;
  cin >> n >> m;
  long long int u, w, c, tp;
  for (int i = 1; i <= m; i++) {
    cin >> u >> w >> c;
    e.push_back({{c, i}, {u, w}});
  }
  vector<long long int> tt;
  sort(e.begin(), e.end());
  fill(p, p + n + 1, -1);
  for (int i = 0; i < e.size(); i++) {
    tp = i;
    do {
      u = e[i].second.first;
      w = e[i].second.second;
      u = get_r(u);
      w = get_r(w);
      if (u != w) {
        v[u].push_back({w, e[i].first.second});
        v[w].push_back({u, e[i].first.second});
        tt.push_back(u);
        tt.push_back(w);
      }
      i++;
    } while (i < e.size() && e[i].first.first == e[i - 1].first.first);
    for (auto pp : tt) {
      if (!ch[pp]) dfs(pp, 0);
      ch[pp] = false;
      v[pp].clear();
    }
    tt.clear();
    i = tp;
    do {
      u = e[i].second.first;
      w = e[i].second.second;
      u = get_r(u);
      w = get_r(w);
      if (u != w) {
        p[u] += p[w];
        p[w] = u;
      }
      i++;
    } while (i < e.size() && e[i].first.first == e[i - 1].first.first);
    i--;
  }
  for (int i = 1; i <= m; i++) {
    if (ans[i] == 0)
      cout << "none\n";
    else if (ans[i] == 1)
      cout << "at least one\n";
    else if (ans[i] == 2)
      cout << "any\n";
  }
  return 0;
}
