OI XXVIII - sza

// https://szkopul.edu.pl/problemset/problem/y-mTVYClxMJcgMhUnHaUqPPq/site/

// Szablon Bajtogrodu

#include <bits/stdc++.h>

using namespace std;

#define int long long

constexpr int sizik = 1000 * 1001;

#define ar std::array
#define pr std::pair
#define vec std::vector

typedef vec<vec<int>> _kra;

constexpr int K = 27;
struct Trie {
    int next[K]{};
    std::vector<ar<int, 3>> y;
    Trie() { ; }
};

std::vector<Trie> trie;

void add_string(std::string s) {
    int curr = 0;
    for (const auto& ch : s) {
        int c = ch - 'A';
        if (trie[curr].next[c] == 0) {
            trie[curr].next[c] = trie.size();
            trie.push_back({});
        }
        curr = trie[curr].next[c];
    }
}

std::vector<std::pair<int, char>> kra[sizik];
int depth[sizik];
int leaf = 0;

void DFS1(int v, int p, int d = 0) {
    depth[v] = d;
    int c1 = 0;
    for (const auto& [u, c] : kra[v]) {
        if (u != p) {
            DFS1(u, v, d + 1);
            c1++;
        }
    }
    if (c1 == 0) {
        leaf = v;
    }
}

void DFS3(int v, int p, const std::string& curr) {
    int c1 = 0;
    for (const auto& [u, c] : kra[v]) {
        if (u != p) {
            DFS3(u, v, (curr + c));
            c1++;
        }
    }
    if (c1 == 0) {
        add_string(curr);
    }
}

void DFS2(int v, int p, int start, int highest, int curr) {
    if (curr > 0) {
        trie[curr].y.push_back({start, v, highest});
    }

    for (const auto& [u, ch] : kra[v]) {
        if (u == p) continue;
        int c = ch - 'A';
        if (trie[curr].next[c] == 0) continue;

        int h1 = highest;
        if (depth[u] < depth[highest]) {
            h1 = u;
        }

        DFS2(u, v, start, h1, trie[curr].next[c]);
    }
}

int pref[sizik];
int n;

bool DFS4(int v, int p) {
    bool e = true;
    for (const auto& [u, ch] : kra[v]) {
        if (u != p) {
            e &= DFS4(u, v);
            pref[v] += pref[u];
        }
    }

    if (v != 1) e &= (pref[v] > 0);
    return e;
}

std::set<std::string> ans;
void DFS_check(int curr, const string& s1) {
    for (int i = 0; i <= ('Z' - 'A'); i++) {
        if (trie[curr].next[i] != 0) {
            for (int i = 1; i <= n; i++) {
                pref[i] = 0;
            }

            for (const auto& [a, b, c] : trie[trie[curr].next[i]].y) {
                pref[a]++;
                pref[b]++;
                pref[c] -= 2;
            }

            std::string s2 = s1 + (char)(i + 'A');

            bool p = DFS4(1, 1);

            if (p) {
                ans.insert(s2);
                std::reverse(s2.begin(), s2.end());
                ans.insert(s2);
            }

            DFS_check(trie[curr].next[i], (s1 + (char)(i + 'A')));
        }
    }
}

void solve() {
    std::cin >> n;

    for (int i = 0; i < n - 1; i++) {
        int a, b;
        char c;
        std::cin >> a >> b >> c;

        kra[a].push_back({b, c});
        kra[b].push_back({a, c});
    }

    if (n == 2) {
        std::cout << kra[1].front().second << '\n';
        return;
    }

    DFS1(1, 1, 0);
    trie.push_back({});
    DFS3(leaf, leaf, "");

    for (int i = 1; i <= n; i++) {
        DFS2(i, i, i, i, 0);
    }

    DFS_check(0, "");

    std::cout << ans.size() << '\n';
    for (const auto& a : ans) {
        std::cout << a << "\n";
    }
}

int32_t main() {
    std::ios_base::sync_with_stdio(0);
    std::cin.tie(0);
    std::cout.tie(0);

    int t = 1;
    // std::cin >> t;

    for (; t > 0; t--) {
        solve();
    }

    return 0;
}