#include<iostream>
#include<map>
#include<vector>
using namespace std;
typedef long long ll;
const int N = 5e3 + 10, D = 210, base = 5001, mod = 1e9 + 7;
int d, n, m, u, v, k, fa[N][D], ans, a[N], b[D];
map<int, int> mp; vector<int> g[N][D], ers;
int fd(int x, int y){
if(fa[x][y] == x) return fa[x][y];
return fa[x][y] = fd(fa[x][y], y);
}
void mg(int u, int v, int k){
a[u] = ((a[u] - (ll)b[k] * fa[u][k]) % mod + mod) % mod;
fa[u][k] = v;
a[u] = ((a[u] + (ll)b[k] * fa[u][k]) % mod + mod) % mod;
}
int main(){
cin >> d >> n >> m;
for(int i = 1; i <= n; i++){
for(int j = 1; j <= d; j++) fa[i][j] = i;
}
b[d] = 1;
for(int i = d-1; i >= 1; i--){
b[i] = (ll)b[i+1] * base % mod;
}
for(int i = 1; i <= n; i++){
int hs = 0;
for(int j = 1; j <= d; j++){
hs = (hs + (ll)b[j] * i % mod) % mod;
g[i][j].push_back(i);
}
a[i] = hs;
mp[hs]++;
}
while(m--){
cin >> u >> v >> k;
u = fd(u, k); v = fd(v, k);
if(u == v){
cout << ans << '\n';
continue;
}
ans = 0;
if(g[u][k].size() > g[v][k].size()) swap(u, v);
for(int nd: g[u][k]){
mp[a[nd]]--;
mg(nd, v, k);
mp[a[nd]]++;
g[v][k].push_back(nd);
}
g[u][k].clear();
for(auto i: mp){
ans += i.second * i.second;
if(i.second == 0) ers.push_back(i.first);
}
for(int i: ers) mp.erase(i);
ers.clear();
cout << ans << '\n';
}
return 0;
}