#include <bits/stdc++.h>
#define endl '\n'
#define int long long
#define fi first
#define se second
#define pb push_back
using namespace std;
vector<vector<pair<int, int>>> adj_t;
vector<vector<int>> adj;
vector<int> vis;
void col(int u, int c){
for(int v : adj[u])
if(!vis[v])
vis[v]= 3 - vis[u], col(v, 3 - c);
}
signed main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int t = 1;
// cin >> t;
while(t--){
// code goes here
int n, m;
cin >> n >> m;
map<pair<int, int>, int> mp;
adj.assign(n+5, vector<int>());
adj_t.assign(n+5, vector<pair<int, int>>());
vis.assign(n+5, 0);
for (int i = 0; i < m; i++){
int u1, v1, c;
cin >> u1 >> v1 >> c;
int u = min(u1, v1);
int v = max(u1, v1);
if (mp.find({u, v}) == mp.end()){
mp[{u, v}] = c;
}
else{
mp[{u, v}] = min(c, mp[{u, v}]);
}
}
for (auto pa: mp){
pair<int, int> p = pa.fi;
int c = pa.se;
adj_t[p.fi].push_back({c, p.se});
adj_t[p.se].push_back({c, p.fi});
}
int ans = 0;
for (int i = 1; i <= n; i++){
sort(adj_t[i].begin(), adj_t[i].end());
// take shortest edge
ans = max(ans, adj_t[i][0].fi);
}
for (auto pa: mp){
pair<int, int> p = pa.fi;
int c = pa.se;
if (c > ans) continue;
adj[p.fi].push_back(p.se);
adj[p.se].push_back(p.fi);
}
// anyhow color
cout << ans << '\n';
for(int i= 1; i <= n; ++i) {
if(!vis[i]) vis[i]= 1, col(i, 1);
cout << (vis[i] == 1 ? 'B' : 'D');
}
}
}