#include <bits/stdc++.h>
using namespace std;
const int N = 3e5 + 5;
const long long mod1 = 1e9 + 7;
const long long mod2 = 998244353;
void FWT(int *a, int len, const int P, int o = 1) {
  const int inv2 = P + 1 >> 1;
  for (int k = 0; 1 << k < len; ++k)
    for (int i = (0); i < (len); i++)
      if (~i >> k & 1) {
        int j = i ^ (1 << k), x, y;
        x = (a[i] + a[j]) % P, y = (a[i] - a[j] + P) % P;
        if (o == -1) x = (long long)x * inv2 % P, y = (long long)y * inv2 % P;
        a[i] = x, a[j] = y;
      }
}
int n, m, cnt;
vector<pair<long long, int> > g[N];
vector<int> s[N];
int fa[N], w[N], dep[N];
void dfs(int u, int p) {
  fa[u] = p, dep[u] = dep[p] + 1;
  for (auto it : g[u]) {
    if (it.first == p) continue;
    w[it.first] = it.second;
    if (dep[it.first]) {
      if (dep[it.first] < dep[u]) {
        cnt++;
        s[cnt].push_back(it.second);
        int cur = u;
        while (cur != it.first) {
          s[cnt].push_back(w[cur]);
          cur = fa[cur];
        }
      }
    } else
      dfs(it.first, u);
  }
}
int a[N], b[N], c[N], d[N];
int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  cin >> n >> m;
  int u, v, w;
  int now = 0;
  for (int i = (1); i < (m + 1); i++) {
    cin >> u >> v >> w;
    g[u].push_back(pair<long long, int>(v, w));
    g[v].push_back(pair<long long, int>(u, w));
    now ^= w;
  }
  dfs(1, 0);
  a[now] = 1;
  c[now] = 1;
  FWT(a, 1 << 17, mod1);
  FWT(c, 1 << 17, mod2);
  for (int i = (1); i < (cnt + 1); i++) {
    for (auto v : s[i]) b[v]++, d[v]++;
    FWT(b, 1 << 17, mod1);
    FWT(d, 1 << 17, mod2);
    for (int j = (0); j < (1 << 17); j++)
      a[j] = (long long)a[j] * b[j] % mod1, b[j] = 0,
      c[j] = (long long)c[j] * d[j] % mod2, d[j] = 0;
  }
  FWT(a, 1 << 17, mod1, -1);
  FWT(c, 1 << 17, mod2, -1);
  for (int j = (0); j < (1 << 17); j++) {
    if (c[j] || a[j]) {
      cout << j << " " << a[j] << "\n";
      break;
    }
  }
  return 0;
}
