#include <bits/stdc++.h>
#pragma comment(linker, "/STACK:16777216")
using namespace std;
const double pi = 3.14159265358979323846264338327950288419716939937511;
const double eps = 1e-11;
char ch_ch_ch[1 << 20];
string gs() {
  scanf("%s", ch_ch_ch);
  return string(ch_ch_ch);
}
string gl() {
  gets(ch_ch_ch);
  return string(ch_ch_ch);
}
vector<vector<int> > G;
struct edge {
  int u, v, c;
  edge() {}
  edge(int uu, int vv, int cc) : u(uu), v(vv), c(cc) {}
};
int dpr[100100];
long long sz[100100];
int dsu_get(int v) {
  if (dpr[v] != v) dpr[v] = dsu_get(dpr[v]);
  return dpr[v];
}
int dsu_uni(int a, int b) {
  a = dsu_get(a);
  b = dsu_get(b);
  if (rand() & 1) swap(a, b);
  return dpr[a] = b;
}
int n;
bool chk(int v) {
  while (v) {
    int a = v % 10;
    v /= 10;
    if (a != 4 && a != 7) return false;
  }
  return true;
}
vector<edge> E;
long long res = 0;
set<int> s;
void solution() {
  scanf("%d", &n);
  if (n < 3) {
    cout << 0 << endl;
    return;
  }
  for (int i = 0; i < (n); ++i) {
    dpr[i] = i;
    sz[i] = 1;
  }
  for (int i = 0; i < (n - 1); ++i) {
    int u, v, w;
    scanf("%d%d%d", &u, &v, &w);
    --u, --v;
    if (v < u) swap(v, u);
    E.push_back(edge(u, v, chk(w)));
  }
  for (int i = 0; i < (E.size()); ++i)
    if (!E[i].c)
      if (dsu_get(E[i].v) != dsu_get(E[i].u)) {
        int newsz = sz[dsu_get(E[i].v)] + sz[dsu_get(E[i].u)];
        sz[dsu_uni(E[i].v, E[i].u)] = newsz;
      }
  for (int i = 0; i < (n); ++i)
    if (s.find(dsu_get(i)) == s.end()) {
      int v = dsu_get(i);
      s.insert(v);
      res += sz[v] * (n - sz[v]) * (n - sz[v] - 1);
    }
  cout << res << endl;
}
int main(int argc, char** argv) {
  solution();
  return 0;
}
