//#pragma GCC optimize("Ofast,unroll-loops")
//#pragma GCC target("avx2,tune=native")
#include <bits/stdc++.h>
using namespace std;
 
#define file "o"
#define ff(i, a, b) for(auto i=(a); i<=(b); ++i)
#define ffr(i, b, a) for(auto i=(b); i>=(a); --i)
#define nl "\n"
#define ss " "
#define pb emplace_back
#define fi first
#define se second
#define sz(s) (int)s.size()
#define all(s) (s).begin(), (s).end()
#define ms(a,x) memset(a, x, sizeof (a))
#define cn continue
#define re exit(0)
 
typedef long long ll;
typedef vector<int> vi;
 
const int maxn = 400000 + 15;
const ll INF = (ll)4e18;
 
int n, m;
int st[maxn], ed[maxn], timer=0;
int st2[maxn], tour2[20][maxn*2], timer2=0;
int h[maxn];
vi g[maxn], ng[maxn], c[maxn], cur;
ll ans[maxn], dff[maxn];
int node_at_tin[maxn];
 
// compute subtree size quickly as ed - st + 1
 
void dfs(int u, int par)
{
    st[u]=++timer;
    st2[u]=++timer2; tour2[0][timer2]=u;
    for(auto v:g[u]) if(v!=par)
    {
        h[v]=h[u]+1;
        dfs(v, u);
        tour2[0][++timer2]=u;
    }
    ed[u]=timer;
}
 
void pre()
{
    int LOG = 19;
    ff(j, 1, LOG) ff(i, 1, timer2-(1<<j)+1)
    {
        int u=tour2[j-1][i], v=tour2[j-1][i+(1<<(j-1))];
        if(h[u]<h[v]) tour2[j][i]=u;
        else tour2[j][i]=v;
    }
}
 
inline int lca(int u, int v)
{
    int l=st2[u], r=st2[v];
    if (l>r) swap(l, r);
    int k=31-__builtin_clz(r-l+1);
    int a = tour2[k][l], b = tour2[k][r-(1<<k)+1];
    if(h[a] < h[b]) return a;
    else return b;
}
 
inline bool cmp_tin(int u, int v)
{
    return st[u] < st[v];
}
 
inline bool child_of(int u, int v)
{
    return st[u] <= st[v] && ed[v] <= ed[u];
}
 
inline void upd(int l, int r, ll val)
{
    if (l>r) return;
    dff[l] += val;
    dff[r+1] -= val;
}
 
void build_virtual()
{
    sort(all(cur), cmp_tin);
    int k = sz(cur);
    // add LCAs of consecutive
    for (int i = 0; i+1 < k; ++i) cur.pb(lca(cur[i], cur[i+1]));
    sort(all(cur), cmp_tin);
    cur.erase(unique(all(cur)), cur.end());
    // clear adjacency
    for (int x : cur) ng[x].clear();
    // build with stack
    vector<int> stck;
    stck.reserve(sz(cur));
    stck.push_back(cur[0]);
    for (int i = 1; i < sz(cur); ++i)
    {
        int v = cur[i];
        while (!child_of(stck.back(), v)) {
            int u = stck.back(); stck.pop_back();
            ng[stck.back()].pb(u);
        }
        stck.push_back(v);
    }
    while (sz(stck) > 1) {
        int u = stck.back(); stck.pop_back();
        ng[stck.back()].pb(u);
    }
}
 
int cnt_in_subtree(const vi &vec, int v)
{
    // vec sorted by tin
    auto lo = lower_bound(vec.begin(), vec.end(), st[v], [&](int node, int value){ return st[node] < value; });
    auto hi = upper_bound(vec.begin(), vec.end(), ed[v], [&](int value, int node){ return value < st[node]; });
    return int(hi - lo);
}
 
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr); cout.tie(nullptr);
    if (fopen(file".inp","r")) {
        freopen(file".inp","r",stdin);
        freopen(file".out","w",stdout);
    }
    int sub; if(!(cin>>sub)) return 0;
    cin >> n >> m;
    ff(i,1,n){
        int x; cin >> x; c[x].pb(i);
    }
    ff(i,1,n-1){
        int u,v,w; cin >> u >> v >> w;
        g[u].pb(v); g[v].pb(u);
    }
 
    // preprocess
    timer = 0; timer2 = 0;
    h[1] = 0;
    dfs(1, 0);
    pre();
    // build inverse tin
    ff(i,1,n) node_at_tin[st[i]] = i;
 
    // mark array for colored nodes per color
    static int is_col[maxn];
    ms(is_col, 0);
    ms(dff, 0);
    // process each color
    for (int col = 1; col <= n; ++col)
    {
        if (c[col].empty()) continue;
        // vec: original colored nodes sorted by tin
        vi vec = c[col];
        sort(all(vec), cmp_tin);
        // prepare cur = vec (will be appended LCAs inside build_virtual)
        cur.clear();
        for (int x : vec) cur.pb(x);
        // mark colored nodes
        for (int x : vec) is_col[x] = 1;
        // build virtual tree (ng adjacency filled, cur updated)
        build_virtual();
        // iterate virtual nodes in cur and compute contributions
        for (int v : cur)
        {
            // sum sizes of virtual children
            ll sum_ch = 0;
            for (int ch : ng[v]) {
                int subch = ed[ch] - st[ch] + 1;
                sum_ch += subch;
            }
            bool v_is_col = is_col[v];
            int sub_v = ed[v] - st[v] + 1;
            if (!v_is_col)
            {
                // one block: subtree[v] minus children's subtrees
                ll block_sz = (ll)sub_v - sum_ch;
                if (block_sz > 0)
                {
                    ll val = (ll)n - block_sz;
                    // add val to subtree[v]
                    upd(st[v], ed[v], val);
                    // subtract val from each child subtree
                    for (int ch : ng[v]) upd(st[ch], ed[ch], -val);
                }
            }
            else
            {
                // v is colored: each neighbor-side that contains 0 colored nodes is a block
                // iterate original neighbors
                for (int to : g[v])
                {
                    if (child_of(to, v)) {
                        // to is ancestor of v -> parent side; shouldn't happen because child_of(to,v) means to is ancestor of v
                        // but in tree adjacency, either to is child of v or parent of v
                    }
                    if (child_of(v, to)) {
                        // 'to' is child of v in original rooted tree
                        int cntcol = cnt_in_subtree(vec, to);
                        int side_sz = ed[to] - st[to] + 1;
                        if (cntcol == 0) {
                            ll val = (ll)n - side_sz;
                            upd(st[to], ed[to], val);
                        }
                    } else {
                        // 'to' is parent side (outside subtree v)
                        int total_col = sz(vec);
                        int inside_v = cnt_in_subtree(vec, v);
                        int outside_col = total_col - inside_v;
                        int side_sz = n - sub_v;
                        if (outside_col == 0 && side_sz > 0) {
                            ll val = (ll)n - side_sz;
                            // outside subtree: two intervals [1, st[v]-1] and [ed[v]+1, n]
                            if (st[v] > 1) upd(1, st[v]-1, val);
                            if (ed[v] < n) upd(ed[v]+1, n, val);
                        }
                    }
                }
                // colored node itself: every path to any node contains its own color
                upd(st[v], st[v], (ll)n);
            }
        }
        // cleanup marks
        for (int x : vec) is_col[x] = 0;
    }
 
    // accumulate diff to ans
    ll curv = 0;
    ff(t,1,n)
    {
        curv += dff[t];
        ans[node_at_tin[t]] = curv;
    }
 
    // print answers
    ff(i,1,n)
    {
        if (i>1) cout << ' ';
        cout << ans[i];
    }
    cout << '\n';
    return 0;
}
 
				Ly8jcHJhZ21hIEdDQyBvcHRpbWl6ZSgiT2Zhc3QsdW5yb2xsLWxvb3BzIikKLy8jcHJhZ21hIEdDQyB0YXJnZXQoImF2eDIsdHVuZT1uYXRpdmUiKQojaW5jbHVkZSA8Yml0cy9zdGRjKysuaD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCiNkZWZpbmUgZmlsZSAibyIKI2RlZmluZSBmZihpLCBhLCBiKSBmb3IoYXV0byBpPShhKTsgaTw9KGIpOyArK2kpCiNkZWZpbmUgZmZyKGksIGIsIGEpIGZvcihhdXRvIGk9KGIpOyBpPj0oYSk7IC0taSkKI2RlZmluZSBubCAiXG4iCiNkZWZpbmUgc3MgIiAiCiNkZWZpbmUgcGIgZW1wbGFjZV9iYWNrCiNkZWZpbmUgZmkgZmlyc3QKI2RlZmluZSBzZSBzZWNvbmQKI2RlZmluZSBzeihzKSAoaW50KXMuc2l6ZSgpCiNkZWZpbmUgYWxsKHMpIChzKS5iZWdpbigpLCAocykuZW5kKCkKI2RlZmluZSBtcyhhLHgpIG1lbXNldChhLCB4LCBzaXplb2YgKGEpKQojZGVmaW5lIGNuIGNvbnRpbnVlCiNkZWZpbmUgcmUgZXhpdCgwKQoKdHlwZWRlZiBsb25nIGxvbmcgbGw7CnR5cGVkZWYgdmVjdG9yPGludD4gdmk7Cgpjb25zdCBpbnQgbWF4biA9IDQwMDAwMCArIDE1Owpjb25zdCBsbCBJTkYgPSAobGwpNGUxODsKCmludCBuLCBtOwppbnQgc3RbbWF4bl0sIGVkW21heG5dLCB0aW1lcj0wOwppbnQgc3QyW21heG5dLCB0b3VyMlsyMF1bbWF4bioyXSwgdGltZXIyPTA7CmludCBoW21heG5dOwp2aSBnW21heG5dLCBuZ1ttYXhuXSwgY1ttYXhuXSwgY3VyOwpsbCBhbnNbbWF4bl0sIGRmZlttYXhuXTsKaW50IG5vZGVfYXRfdGluW21heG5dOwoKLy8gY29tcHV0ZSBzdWJ0cmVlIHNpemUgcXVpY2tseSBhcyBlZCAtIHN0ICsgMQoKdm9pZCBkZnMoaW50IHUsIGludCBwYXIpCnsKICAgIHN0W3VdPSsrdGltZXI7CiAgICBzdDJbdV09Kyt0aW1lcjI7IHRvdXIyWzBdW3RpbWVyMl09dTsKICAgIGZvcihhdXRvIHY6Z1t1XSkgaWYodiE9cGFyKQogICAgewogICAgICAgIGhbdl09aFt1XSsxOwogICAgICAgIGRmcyh2LCB1KTsKICAgICAgICB0b3VyMlswXVsrK3RpbWVyMl09dTsKICAgIH0KICAgIGVkW3VdPXRpbWVyOwp9Cgp2b2lkIHByZSgpCnsKICAgIGludCBMT0cgPSAxOTsKICAgIGZmKGosIDEsIExPRykgZmYoaSwgMSwgdGltZXIyLSgxPDxqKSsxKQogICAgewogICAgICAgIGludCB1PXRvdXIyW2otMV1baV0sIHY9dG91cjJbai0xXVtpKygxPDwoai0xKSldOwogICAgICAgIGlmKGhbdV08aFt2XSkgdG91cjJbal1baV09dTsKICAgICAgICBlbHNlIHRvdXIyW2pdW2ldPXY7CiAgICB9Cn0KCmlubGluZSBpbnQgbGNhKGludCB1LCBpbnQgdikKewogICAgaW50IGw9c3QyW3VdLCByPXN0Mlt2XTsKICAgIGlmIChsPnIpIHN3YXAobCwgcik7CiAgICBpbnQgaz0zMS1fX2J1aWx0aW5fY2x6KHItbCsxKTsKICAgIGludCBhID0gdG91cjJba11bbF0sIGIgPSB0b3VyMltrXVtyLSgxPDxrKSsxXTsKICAgIGlmKGhbYV0gPCBoW2JdKSByZXR1cm4gYTsKICAgIGVsc2UgcmV0dXJuIGI7Cn0KCmlubGluZSBib29sIGNtcF90aW4oaW50IHUsIGludCB2KQp7CiAgICByZXR1cm4gc3RbdV0gPCBzdFt2XTsKfQoKaW5saW5lIGJvb2wgY2hpbGRfb2YoaW50IHUsIGludCB2KQp7CiAgICByZXR1cm4gc3RbdV0gPD0gc3Rbdl0gJiYgZWRbdl0gPD0gZWRbdV07Cn0KCmlubGluZSB2b2lkIHVwZChpbnQgbCwgaW50IHIsIGxsIHZhbCkKewogICAgaWYgKGw+cikgcmV0dXJuOwogICAgZGZmW2xdICs9IHZhbDsKICAgIGRmZltyKzFdIC09IHZhbDsKfQoKdm9pZCBidWlsZF92aXJ0dWFsKCkKewogICAgc29ydChhbGwoY3VyKSwgY21wX3Rpbik7CiAgICBpbnQgayA9IHN6KGN1cik7CiAgICAvLyBhZGQgTENBcyBvZiBjb25zZWN1dGl2ZQogICAgZm9yIChpbnQgaSA9IDA7IGkrMSA8IGs7ICsraSkgY3VyLnBiKGxjYShjdXJbaV0sIGN1cltpKzFdKSk7CiAgICBzb3J0KGFsbChjdXIpLCBjbXBfdGluKTsKICAgIGN1ci5lcmFzZSh1bmlxdWUoYWxsKGN1cikpLCBjdXIuZW5kKCkpOwogICAgLy8gY2xlYXIgYWRqYWNlbmN5CiAgICBmb3IgKGludCB4IDogY3VyKSBuZ1t4XS5jbGVhcigpOwogICAgLy8gYnVpbGQgd2l0aCBzdGFjawogICAgdmVjdG9yPGludD4gc3RjazsKICAgIHN0Y2sucmVzZXJ2ZShzeihjdXIpKTsKICAgIHN0Y2sucHVzaF9iYWNrKGN1clswXSk7CiAgICBmb3IgKGludCBpID0gMTsgaSA8IHN6KGN1cik7ICsraSkKICAgIHsKICAgICAgICBpbnQgdiA9IGN1cltpXTsKICAgICAgICB3aGlsZSAoIWNoaWxkX29mKHN0Y2suYmFjaygpLCB2KSkgewogICAgICAgICAgICBpbnQgdSA9IHN0Y2suYmFjaygpOyBzdGNrLnBvcF9iYWNrKCk7CiAgICAgICAgICAgIG5nW3N0Y2suYmFjaygpXS5wYih1KTsKICAgICAgICB9CiAgICAgICAgc3Rjay5wdXNoX2JhY2sodik7CiAgICB9CiAgICB3aGlsZSAoc3ooc3RjaykgPiAxKSB7CiAgICAgICAgaW50IHUgPSBzdGNrLmJhY2soKTsgc3Rjay5wb3BfYmFjaygpOwogICAgICAgIG5nW3N0Y2suYmFjaygpXS5wYih1KTsKICAgIH0KfQoKaW50IGNudF9pbl9zdWJ0cmVlKGNvbnN0IHZpICZ2ZWMsIGludCB2KQp7CiAgICAvLyB2ZWMgc29ydGVkIGJ5IHRpbgogICAgYXV0byBsbyA9IGxvd2VyX2JvdW5kKHZlYy5iZWdpbigpLCB2ZWMuZW5kKCksIHN0W3ZdLCBbJl0oaW50IG5vZGUsIGludCB2YWx1ZSl7IHJldHVybiBzdFtub2RlXSA8IHZhbHVlOyB9KTsKICAgIGF1dG8gaGkgPSB1cHBlcl9ib3VuZCh2ZWMuYmVnaW4oKSwgdmVjLmVuZCgpLCBlZFt2XSwgWyZdKGludCB2YWx1ZSwgaW50IG5vZGUpeyByZXR1cm4gdmFsdWUgPCBzdFtub2RlXTsgfSk7CiAgICByZXR1cm4gaW50KGhpIC0gbG8pOwp9CgppbnQgbWFpbigpCnsKICAgIGlvczo6c3luY193aXRoX3N0ZGlvKGZhbHNlKTsKICAgIGNpbi50aWUobnVsbHB0cik7IGNvdXQudGllKG51bGxwdHIpOwogICAgaWYgKGZvcGVuKGZpbGUiLmlucCIsInIiKSkgewogICAgICAgIGZyZW9wZW4oZmlsZSIuaW5wIiwiciIsc3RkaW4pOwogICAgICAgIGZyZW9wZW4oZmlsZSIub3V0IiwidyIsc3Rkb3V0KTsKICAgIH0KICAgIGludCBzdWI7IGlmKCEoY2luPj5zdWIpKSByZXR1cm4gMDsKICAgIGNpbiA+PiBuID4+IG07CiAgICBmZihpLDEsbil7CiAgICAgICAgaW50IHg7IGNpbiA+PiB4OyBjW3hdLnBiKGkpOwogICAgfQogICAgZmYoaSwxLG4tMSl7CiAgICAgICAgaW50IHUsdix3OyBjaW4gPj4gdSA+PiB2ID4+IHc7CiAgICAgICAgZ1t1XS5wYih2KTsgZ1t2XS5wYih1KTsKICAgIH0KCiAgICAvLyBwcmVwcm9jZXNzCiAgICB0aW1lciA9IDA7IHRpbWVyMiA9IDA7CiAgICBoWzFdID0gMDsKICAgIGRmcygxLCAwKTsKICAgIHByZSgpOwogICAgLy8gYnVpbGQgaW52ZXJzZSB0aW4KICAgIGZmKGksMSxuKSBub2RlX2F0X3RpbltzdFtpXV0gPSBpOwoKICAgIC8vIG1hcmsgYXJyYXkgZm9yIGNvbG9yZWQgbm9kZXMgcGVyIGNvbG9yCiAgICBzdGF0aWMgaW50IGlzX2NvbFttYXhuXTsKICAgIG1zKGlzX2NvbCwgMCk7CiAgICBtcyhkZmYsIDApOwogICAgLy8gcHJvY2VzcyBlYWNoIGNvbG9yCiAgICBmb3IgKGludCBjb2wgPSAxOyBjb2wgPD0gbjsgKytjb2wpCiAgICB7CiAgICAgICAgaWYgKGNbY29sXS5lbXB0eSgpKSBjb250aW51ZTsKICAgICAgICAvLyB2ZWM6IG9yaWdpbmFsIGNvbG9yZWQgbm9kZXMgc29ydGVkIGJ5IHRpbgogICAgICAgIHZpIHZlYyA9IGNbY29sXTsKICAgICAgICBzb3J0KGFsbCh2ZWMpLCBjbXBfdGluKTsKICAgICAgICAvLyBwcmVwYXJlIGN1ciA9IHZlYyAod2lsbCBiZSBhcHBlbmRlZCBMQ0FzIGluc2lkZSBidWlsZF92aXJ0dWFsKQogICAgICAgIGN1ci5jbGVhcigpOwogICAgICAgIGZvciAoaW50IHggOiB2ZWMpIGN1ci5wYih4KTsKICAgICAgICAvLyBtYXJrIGNvbG9yZWQgbm9kZXMKICAgICAgICBmb3IgKGludCB4IDogdmVjKSBpc19jb2xbeF0gPSAxOwogICAgICAgIC8vIGJ1aWxkIHZpcnR1YWwgdHJlZSAobmcgYWRqYWNlbmN5IGZpbGxlZCwgY3VyIHVwZGF0ZWQpCiAgICAgICAgYnVpbGRfdmlydHVhbCgpOwogICAgICAgIC8vIGl0ZXJhdGUgdmlydHVhbCBub2RlcyBpbiBjdXIgYW5kIGNvbXB1dGUgY29udHJpYnV0aW9ucwogICAgICAgIGZvciAoaW50IHYgOiBjdXIpCiAgICAgICAgewogICAgICAgICAgICAvLyBzdW0gc2l6ZXMgb2YgdmlydHVhbCBjaGlsZHJlbgogICAgICAgICAgICBsbCBzdW1fY2ggPSAwOwogICAgICAgICAgICBmb3IgKGludCBjaCA6IG5nW3ZdKSB7CiAgICAgICAgICAgICAgICBpbnQgc3ViY2ggPSBlZFtjaF0gLSBzdFtjaF0gKyAxOwogICAgICAgICAgICAgICAgc3VtX2NoICs9IHN1YmNoOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJvb2wgdl9pc19jb2wgPSBpc19jb2xbdl07CiAgICAgICAgICAgIGludCBzdWJfdiA9IGVkW3ZdIC0gc3Rbdl0gKyAxOwogICAgICAgICAgICBpZiAoIXZfaXNfY29sKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBvbmUgYmxvY2s6IHN1YnRyZWVbdl0gbWludXMgY2hpbGRyZW4ncyBzdWJ0cmVlcwogICAgICAgICAgICAgICAgbGwgYmxvY2tfc3ogPSAobGwpc3ViX3YgLSBzdW1fY2g7CiAgICAgICAgICAgICAgICBpZiAoYmxvY2tfc3ogPiAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGxsIHZhbCA9IChsbCluIC0gYmxvY2tfc3o7CiAgICAgICAgICAgICAgICAgICAgLy8gYWRkIHZhbCB0byBzdWJ0cmVlW3ZdCiAgICAgICAgICAgICAgICAgICAgdXBkKHN0W3ZdLCBlZFt2XSwgdmFsKTsKICAgICAgICAgICAgICAgICAgICAvLyBzdWJ0cmFjdCB2YWwgZnJvbSBlYWNoIGNoaWxkIHN1YnRyZWUKICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBjaCA6IG5nW3ZdKSB1cGQoc3RbY2hdLCBlZFtjaF0sIC12YWwpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gdiBpcyBjb2xvcmVkOiBlYWNoIG5laWdoYm9yLXNpZGUgdGhhdCBjb250YWlucyAwIGNvbG9yZWQgbm9kZXMgaXMgYSBibG9jawogICAgICAgICAgICAgICAgLy8gaXRlcmF0ZSBvcmlnaW5hbCBuZWlnaGJvcnMKICAgICAgICAgICAgICAgIGZvciAoaW50IHRvIDogZ1t2XSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGRfb2YodG8sIHYpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRvIGlzIGFuY2VzdG9yIG9mIHYgLT4gcGFyZW50IHNpZGU7IHNob3VsZG4ndCBoYXBwZW4gYmVjYXVzZSBjaGlsZF9vZih0byx2KSBtZWFucyB0byBpcyBhbmNlc3RvciBvZiB2CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJ1dCBpbiB0cmVlIGFkamFjZW5jeSwgZWl0aGVyIHRvIGlzIGNoaWxkIG9mIHYgb3IgcGFyZW50IG9mIHYKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkX29mKHYsIHRvKSkgewogICAgICAgICAgICAgICAgICAgICAgICAvLyAndG8nIGlzIGNoaWxkIG9mIHYgaW4gb3JpZ2luYWwgcm9vdGVkIHRyZWUKICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNudGNvbCA9IGNudF9pbl9zdWJ0cmVlKHZlYywgdG8pOwogICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2lkZV9zeiA9IGVkW3RvXSAtIHN0W3RvXSArIDE7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjbnRjb2wgPT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGwgdmFsID0gKGxsKW4gLSBzaWRlX3N6OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBkKHN0W3RvXSwgZWRbdG9dLCB2YWwpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gJ3RvJyBpcyBwYXJlbnQgc2lkZSAob3V0c2lkZSBzdWJ0cmVlIHYpCiAgICAgICAgICAgICAgICAgICAgICAgIGludCB0b3RhbF9jb2wgPSBzeih2ZWMpOwogICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5zaWRlX3YgPSBjbnRfaW5fc3VidHJlZSh2ZWMsIHYpOwogICAgICAgICAgICAgICAgICAgICAgICBpbnQgb3V0c2lkZV9jb2wgPSB0b3RhbF9jb2wgLSBpbnNpZGVfdjsKICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNpZGVfc3ogPSBuIC0gc3ViX3Y7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvdXRzaWRlX2NvbCA9PSAwICYmIHNpZGVfc3ogPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbCB2YWwgPSAobGwpbiAtIHNpZGVfc3o7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvdXRzaWRlIHN1YnRyZWU6IHR3byBpbnRlcnZhbHMgWzEsIHN0W3ZdLTFdIGFuZCBbZWRbdl0rMSwgbl0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdFt2XSA+IDEpIHVwZCgxLCBzdFt2XS0xLCB2YWwpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVkW3ZdIDwgbikgdXBkKGVkW3ZdKzEsIG4sIHZhbCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvLyBjb2xvcmVkIG5vZGUgaXRzZWxmOiBldmVyeSBwYXRoIHRvIGFueSBub2RlIGNvbnRhaW5zIGl0cyBvd24gY29sb3IKICAgICAgICAgICAgICAgIHVwZChzdFt2XSwgc3Rbdl0sIChsbCluKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvLyBjbGVhbnVwIG1hcmtzCiAgICAgICAgZm9yIChpbnQgeCA6IHZlYykgaXNfY29sW3hdID0gMDsKICAgIH0KCiAgICAvLyBhY2N1bXVsYXRlIGRpZmYgdG8gYW5zCiAgICBsbCBjdXJ2ID0gMDsKICAgIGZmKHQsMSxuKQogICAgewogICAgICAgIGN1cnYgKz0gZGZmW3RdOwogICAgICAgIGFuc1tub2RlX2F0X3Rpblt0XV0gPSBjdXJ2OwogICAgfQoKICAgIC8vIHByaW50IGFuc3dlcnMKICAgIGZmKGksMSxuKQogICAgewogICAgICAgIGlmIChpPjEpIGNvdXQgPDwgJyAnOwogICAgICAgIGNvdXQgPDwgYW5zW2ldOwogICAgfQogICAgY291dCA8PCAnXG4nOwogICAgcmV0dXJuIDA7Cn0K