#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 2;
const int K = 42;
struct Edge {
  int v, c;
};
int n, m;
vector<Edge> g[N];
int num[N], low[N];
int par[N], parw[N];
int ncyc = 0;
int cyc[K][1 << 17], poss[K][1 << 17];
int all_sum = 0;
void dfs(int u, int p) {
  static int tme = 0;
  num[u] = ++tme;
  for (auto [v, c] : g[u])
    if (v != p) {
      if (!num[v]) {
        par[v] = u;
        parw[v] = c;
        dfs(v, u);
      } else {
        if (num[u] > num[v]) {
          int* poly = cyc[ncyc++];
          ++poly[c];
          for (int x = u; x != v; x = par[x]) {
            ++poly[parw[x]];
          }
        }
      }
    }
}
const int MOD = 1e9 + 7;
void add(int& a, int b) {
  a += b;
  if (a >= MOD) a -= MOD;
  if (a < 0) a += MOD;
}
int sum(int a, int b) { return add(a, b), a; }
int mul(int a, int b) { return (long long)a * b % MOD; }
int pow(int a, int n) {
  int t = 1;
  for (; n > 0; n >>= 1) {
    if (n & 1) t = mul(t, a);
    a = mul(a, a);
  }
  return t;
}
void fwht(int a[], const vector<int>& p, int inv) {
  int n = p.size();
  for (int i = 0; i < n; ++i)
    if (i < p[i]) swap(a[i], a[p[i]]);
  for (int m = 1; m < n; m *= 2)
    for (int i = 0; i < n; i += m * 2)
      for (int j = 0; j < m; ++j) {
        int u = i + j, v = i + j + m;
        if (inv == 1) {
          int tmp = sum(a[u], a[v]);
          a[v] = sum(a[u], -a[v]);
          a[u] = tmp;
        } else {
          int p = a[u], q = a[v];
          a[u] = mul(sum(MOD - p, -q), inv);
          a[v] = mul(sum(MOD - p, q), inv);
        }
      }
}
int main() {
  cin >> n >> m;
  for (int i = 0; i < m; ++i) {
    int u, v, w;
    cin >> u >> v >> w;
    g[u].push_back({v, w});
    g[v].push_back({u, w});
    all_sum ^= w;
  }
  dfs(1, 0);
  if (ncyc == 0) {
    cout << all_sum << " 1";
    return 0;
  }
  vector<int> p(1 << 17);
  for (int i = 0; i < 1 << 17; ++i)
    if (i & 1)
      p[i] = p[i - 1] + (1 << 16);
    else
      p[i] = p[i >> 1] >> 1;
  const int invm2 = pow(MOD - 2, MOD - 2);
  for (int i = 0; i < ncyc; ++i) {
    transform(cyc[i], cyc[i] + (1 << 17), poss[i],
              [](int x) { return min(x, 1); });
    fwht(cyc[i], p, 1);
    fwht(poss[i], p, 1);
    if (i > 0) {
      transform(cyc[i], cyc[i] + (1 << 17), cyc[i - 1], cyc[i], mul);
      transform(poss[i], poss[i] + (1 << 17), poss[i - 1], poss[i], mul);
      fwht(poss[i], p, invm2);
      for_each(poss[i], poss[i] + (1 << 17), [](int& x) { x = min(x, 1); });
      fwht(poss[i], p, 1);
    }
  }
  fwht(cyc[ncyc - 1], p, invm2);
  fwht(poss[ncyc - 1], p, invm2);
  int res = (1 << 17) + 1, cnt = 0;
  for (int i = 0; i < 1 << 17; ++i)
    if (poss[ncyc - 1][i]) {
      if ((i ^ all_sum) < res) {
        res = (i ^ all_sum);
        cnt = cyc[ncyc - 1][i];
      }
    }
  cout << res << ' ' << cnt;
  return 0;
}
