#include<bits/stdc++.h>
using namespace std;
const int N = 7e4 + 5;
const int M = 3 * N + 1000;
vector<pair<int, int>> graf[N], kraw;
set<int> miny[N], maxy[N];
int licznik = N;
vector<int> dwu[M];
unordered_map<int, int> mapa;
vector<int> odz(M, -1);
void dfs(int v, int ojc){
    for(auto k : graf[v]){
        int u = k.first;
        int ind = k.second;
        if(u != ojc){
            dfs(u, v);
            if(!miny[u].empty()){
                int a = *miny[u].rbegin();
                if(mapa.find(a) != mapa.end()){
                    int tmp = mapa[a];
                    dwu[tmp].push_back(ind);
                    dwu[ind].push_back(tmp);
                }else{
                    mapa[a] = licznik;
                    odz[licznik] = a;
                    dwu[ind].push_back(licznik);
                    dwu[licznik].push_back(ind);
                    licznik++;
                }
//                cout << u << " " << v << " " << a << " x\n";
            }
            if(!maxy[u].empty()){
                int a = *maxy[u].begin();
                if(mapa.find(a) != mapa.end()){
                    int tmp = mapa[a];
                    dwu[tmp].push_back(ind);
                    dwu[ind].push_back(tmp);
                }else{
                    mapa[a] = licznik;
                    odz[licznik] = a;
                    dwu[ind].push_back(licznik);
                    dwu[licznik].push_back(ind);
                    licznik++;
                }
//                cout << u << " " << v << " " << a << " y\n";
            }
            if(miny[v].size() < miny[u].size()){
                swap(miny[v], miny[u]);
            }
            for(int i : miny[u]){
                if(miny[v].find(i) != miny[v].end()){
                    miny[v].erase(i);
//                    cout << "u: " << u << " v: " << v << " w: " << i << " a\n";
                    continue;
                }
                miny[v].insert(i);
            }
            if(maxy[v].size() < maxy[u].size()){
                swap(maxy[v], maxy[u]);
            }
            for(int i : maxy[u]){
                if(maxy[v].find(i) != maxy[v].end()){
                    maxy[v].erase(i);
//                    cout << "u: " << u << " v: " << v << " w: " << i << " \n";
                    continue;
                }
                maxy[v].insert(i);
            }
        }
    }
}
vector<int> match;
vector<char> vis;
bool powieksz(int v){
    vis[v] = 1;
    for(int u : dwu[v]){
        if(match[u] == -1){
            match[u] = v;
            match[v] = u;
            return true;
        }
    }
    for(int u : dwu[v]){
        if(match[u] != -1){
            int mv = match[u];
            if(mv > 0 && !vis[mv] && powieksz(mv)){
                match[u] = v;
                match[v] = u;
                return true;
            }
        }
    }
    return false;
}
void matching(int l){
    match.assign(M, -1);
    vis.assign(l + 2, 0);
    while(true){
        for(int u = 0; u <= l; u++) vis[u] = 0;
        bool any = false;
        for(int u = 0; u <= l; u++){
            if(match[u] == -1 && !vis[u]){
                if(powieksz(u)) any = true;
            }
        }
        if(!any) break;
    }
}
int main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    int n;
    cin >> n;
    kraw.resize(n - 1);
    for(int i = 0; i < n - 1; i++){
        int a, b;
        cin >> a >> b;
        kraw[i] = {a, b};
        graf[a].push_back({b, i});
        graf[b].push_back({a, i});
    }
    int q;
    cin >> q;
    for(int i = 0; i < q; i++){
        char znak;
        int a, b, c;
        cin >> znak >> a >> b >> c;
        if(znak == 'm'){
            miny[a].insert(c);
            miny[b].insert(c);
        }else{
            maxy[a].insert(c);
            maxy[b].insert(c);
        }
    }
    dfs(1, -1);
//    for(int i = 0; i < n - 1; i++){
//        cout << "i: " << i << "\n";
//        for(int j : dwu[i]){
//            int val = (j >= 0 && j < (int)odz.size() ? odz[j] : -1);
//            cout << j << " " << val << "\n";
//        }
//        cout << "\n";
//    }
    int l = n - 2;
    matching(l);
//    for(int i = 0; i <= n - 2; i++){
//        cout << "i: " << i << " match: " << match[i] << "\n";
//    }
    vector<int> wyn(n - 1, 0);
    for(int i = 0; i <= l; i++){
        if(match[i] != -1){
            int idx = match[i];
            int val = -1;
            if(idx >= 0 && idx < (int)odz.size()) val = odz[idx];
            wyn[i] = (val == -1 ? 0 : val);
        }
    }
    for(int i = 0; i < n - 1; i++){
        cout << kraw[i].first << " " << kraw[i].second << " " << wyn[i] << "\n";
    }
    return 0;
}
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... |