/**
* /\_/\
* (= ._.)
* / >01<\
*
*/
#include<bits/stdc++.h>
#define task ""
#define int long long
#define ii pair<int, int>
#define ll long long
#define ld long double
#define fi first
#define se second
#define faster ios_base::sync_with_stdio(NULL); cin.tie(NULL);
#define F if(fopen(task".inp","r")){ freopen(task".inp","r",stdin); freopen(task".out","w",stdout); }
using namespace std;
const int Q = 1e6 + 21;
const int N = 1e3 + 21;
const int LOG = 20;
const int mod = 1e9 + 7;
const int inf = 1e9 + 7;
const int dx[] = {0, 0, 1, -1};
const int dy[] = {1, -1, 0, 0};
int n, t;
int a[Q];
vector<int> adj[Q];
struct pt
{
int u, v, w;
bool operator<(pt other) const {
return w < other.w;
}
};
struct DSU
{
vector<int> par;
DSU (int n)
{
par.resize(n + 6, -1);
}
int fpar(int u)
{
if(par[u] < 0)
return u;
return par[u] = fpar(par[u]);
}
bool join(int u, int v)
{
u = fpar(u);
v = fpar(v);
if(u == v)
return false;
if(par[u] > par[v])
swap(u, v);
par[u] += par[v];
par[v] = u;
return true;
}
int get_sz(int u)
{
return -par[fpar(u)];
}
};
int power(int a, int b)
{
int res = 1;
while(b)
{
if(b & 1)
res = (res * a) % mod;
a = (a * a) % mod;
b >>= 1;
}
return res;
}
int fac[Q], inv[Q];
void init()
{
fac[0] = 1;
for(int i = 1; i < Q; i++)
fac[i] = (fac[i - 1] * i) % mod;
inv[Q - 1] = power(fac[Q - 1], mod - 2);
for(int i = Q - 2; i >= 0; i--)
inv[i] = (inv[i + 1] * (i + 1)) % mod;
}
int nCk(int n, int k)
{
return fac[n] * inv[k] % mod * inv[n - k] % mod;
}
int sz[Q];
int dfs(int u, int par, int S)
{
sz[u] = 1;
int cur_sum = 0;
int all = nCk(S, 3);
for(int v : adj[u])
{
if(v == par)
continue;
cur_sum = (cur_sum + dfs(v, u, S)) % mod;
sz[u] += sz[v];
int s1 = sz[v];
int s2 = S - sz[v];
int ways = (all - nCk(s1, 3) - nCk(s2, 3)) % mod;
if(ways < 0)
ways += mod;
cur_sum = (cur_sum + ways) % mod;
}
return cur_sum;
}
bool ce[Q];
int cal(int t, DSU dsu)
{
memset(ce, false, sizeof(ce));
int S = 0;
int ans = 0;
for(int u = 1; u <= n; u++)
{
int pu = dsu.fpar(u);
if(ce[pu])
continue;
ce[pu] = true;
S = dsu.get_sz(pu);
if(S >= 3)
{
int sum = dfs(u, 0, S);
ans = (ans + sum) % mod;
}
}
return (2 * ans) % mod;
}
void solve()
{
cin >> n;
cin >> t;
init();
for(int i = 1; i <= n; i++)
cin >> a[i];
vector<pt> edge;
for(int i = 1; i < n; i++)
{
int u, v;
cin >> u;
cin >> v;
edge.push_back({u, v, max(a[u], a[v])});
}
sort(edge.begin(), edge.end());
DSU dsu (n);
for(auto [u, v, w] : edge)
{
if(w >= t)
break;
dsu.join(u, v);
adj[u].push_back(v);
adj[v].push_back(u);
}
int t1 = cal(t - 1, dsu);
for(auto [u, v, w] : edge)
{
if(w > t)
break;
if(w != t)
continue;
dsu.join(u, v);
adj[u].push_back(v);
adj[v].push_back(u);
}
int t2 = cal(t, dsu);
cout << (t2 - t1 + mod) % mod;
cout << '\n';
}
signed main()
{
faster;
F;
int test = 1;
// cin >> test;
while(test--)
{
solve();
}
cerr << "Time elapsed: " << (1.0 * clock() / CLOCKS_PER_SEC) << " s.\n";
return 0;
}
LyoqCiAqICAgL1xfL1wKICogICg9IC5fLikKICogIC8gPjAxPFwKICoKKi8KCiNpbmNsdWRlPGJpdHMvc3RkYysrLmg+CiNkZWZpbmUgdGFzayAiIgojZGVmaW5lIGludCBsb25nIGxvbmcKI2RlZmluZSBpaSBwYWlyPGludCwgaW50PgojZGVmaW5lIGxsIGxvbmcgbG9uZwojZGVmaW5lIGxkIGxvbmcgZG91YmxlCiNkZWZpbmUgZmkgZmlyc3QKI2RlZmluZSBzZSBzZWNvbmQKI2RlZmluZSBmYXN0ZXIgaW9zX2Jhc2U6OnN5bmNfd2l0aF9zdGRpbyhOVUxMKTsgY2luLnRpZShOVUxMKTsKI2RlZmluZSBGIGlmKGZvcGVuKHRhc2siLmlucCIsInIiKSl7IGZyZW9wZW4odGFzayIuaW5wIiwiciIsc3RkaW4pOyBmcmVvcGVuKHRhc2siLm91dCIsInciLHN0ZG91dCk7IH0KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCmNvbnN0IGludCBRID0gMWU2ICsgMjE7CmNvbnN0IGludCBOID0gMWUzICsgMjE7CmNvbnN0IGludCBMT0cgPSAyMDsKY29uc3QgaW50IG1vZCA9IDFlOSArIDc7CmNvbnN0IGludCBpbmYgPSAxZTkgKyA3Owpjb25zdCBpbnQgZHhbXSA9IHswLCAwLCAxLCAtMX07CmNvbnN0IGludCBkeVtdID0gezEsIC0xLCAwLCAwfTsKCmludCBuLCB0OwppbnQgYVtRXTsKCnZlY3RvcjxpbnQ+IGFkaltRXTsKCnN0cnVjdCBwdAp7CiAgICBpbnQgdSwgdiwgdzsKCiAgICBib29sIG9wZXJhdG9yPChwdCBvdGhlcikgY29uc3QgewogICAgICAgIHJldHVybiB3IDwgb3RoZXIudzsKICAgIH0KfTsKCnN0cnVjdCBEU1UKewogICAgdmVjdG9yPGludD4gcGFyOwoKICAgIERTVSAoaW50IG4pCiAgICB7CiAgICAgICAgcGFyLnJlc2l6ZShuICsgNiwgLTEpOwogICAgfQoKICAgIGludCBmcGFyKGludCB1KQogICAgewogICAgICAgIGlmKHBhclt1XSA8IDApCiAgICAgICAgICAgIHJldHVybiB1OwoKICAgICAgICByZXR1cm4gcGFyW3VdID0gZnBhcihwYXJbdV0pOwogICAgfQoKICAgIGJvb2wgam9pbihpbnQgdSwgaW50IHYpCiAgICB7CiAgICAgICAgdSA9IGZwYXIodSk7CiAgICAgICAgdiA9IGZwYXIodik7CgogICAgICAgIGlmKHUgPT0gdikKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwoKICAgICAgICBpZihwYXJbdV0gPiBwYXJbdl0pCiAgICAgICAgICAgIHN3YXAodSwgdik7CgogICAgICAgIHBhclt1XSArPSBwYXJbdl07CiAgICAgICAgcGFyW3ZdID0gdTsKCiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9CgogICAgaW50IGdldF9zeihpbnQgdSkKICAgIHsKICAgICAgICByZXR1cm4gLXBhcltmcGFyKHUpXTsKICAgIH0KfTsKCmludCBwb3dlcihpbnQgYSwgaW50IGIpCnsKICAgIGludCByZXMgPSAxOwoKICAgIHdoaWxlKGIpCiAgICB7CiAgICAgICAgaWYoYiAmIDEpCiAgICAgICAgICAgIHJlcyA9IChyZXMgKiBhKSAlIG1vZDsKCiAgICAgICAgYSA9IChhICogYSkgJSBtb2Q7CiAgICAgICAgYiA+Pj0gMTsKICAgIH0KCiAgICByZXR1cm4gcmVzOwp9CgppbnQgZmFjW1FdLCBpbnZbUV07Cgp2b2lkIGluaXQoKQp7CiAgICBmYWNbMF0gPSAxOwoKICAgIGZvcihpbnQgaSA9IDE7IGkgPCBROyBpKyspCiAgICAgICAgZmFjW2ldID0gKGZhY1tpIC0gMV0gKiBpKSAlIG1vZDsKCiAgICBpbnZbUSAtIDFdID0gcG93ZXIoZmFjW1EgLSAxXSwgbW9kIC0gMik7CgogICAgZm9yKGludCBpID0gUSAtIDI7IGkgPj0gMDsgaS0tKQogICAgICAgIGludltpXSA9IChpbnZbaSArIDFdICogKGkgKyAxKSkgJSBtb2Q7Cn0KCmludCBuQ2soaW50IG4sIGludCBrKQp7CiAgICByZXR1cm4gZmFjW25dICogaW52W2tdICUgbW9kICogaW52W24gLSBrXSAlIG1vZDsKfQoKaW50IHN6W1FdOwoKaW50IGRmcyhpbnQgdSwgaW50IHBhciwgaW50IFMpCnsKICAgIHN6W3VdID0gMTsKICAgIGludCBjdXJfc3VtID0gMDsKICAgIGludCBhbGwgPSBuQ2soUywgMyk7CgogICAgZm9yKGludCB2IDogYWRqW3VdKQogICAgewogICAgICAgIGlmKHYgPT0gcGFyKQogICAgICAgICAgICBjb250aW51ZTsKCiAgICAgICAgY3VyX3N1bSA9IChjdXJfc3VtICsgZGZzKHYsIHUsIFMpKSAlIG1vZDsKICAgICAgICBzelt1XSArPSBzelt2XTsKCiAgICAgICAgaW50IHMxID0gc3pbdl07CiAgICAgICAgaW50IHMyID0gUyAtIHN6W3ZdOwoKICAgICAgICBpbnQgd2F5cyA9IChhbGwgLSBuQ2soczEsIDMpIC0gbkNrKHMyLCAzKSkgJSBtb2Q7CgogICAgICAgIGlmKHdheXMgPCAwKQogICAgICAgICAgICB3YXlzICs9IG1vZDsKCiAgICAgICAgY3VyX3N1bSA9IChjdXJfc3VtICsgd2F5cykgJSBtb2Q7CiAgICB9CgogICAgcmV0dXJuIGN1cl9zdW07Cn0KCmJvb2wgY2VbUV07CgppbnQgY2FsKGludCB0LCBEU1UgZHN1KQp7CiAgICBtZW1zZXQoY2UsIGZhbHNlLCBzaXplb2YoY2UpKTsKCiAgICBpbnQgUyA9IDA7CiAgICBpbnQgYW5zID0gMDsKCiAgICBmb3IoaW50IHUgPSAxOyB1IDw9IG47IHUrKykKICAgIHsKICAgICAgICBpbnQgcHUgPSBkc3UuZnBhcih1KTsKCiAgICAgICAgaWYoY2VbcHVdKQogICAgICAgICAgICBjb250aW51ZTsKCiAgICAgICAgY2VbcHVdID0gdHJ1ZTsKICAgICAgICBTID0gZHN1LmdldF9zeihwdSk7CgogICAgICAgIGlmKFMgPj0gMykKICAgICAgICB7CiAgICAgICAgICAgIGludCBzdW0gPSBkZnModSwgMCwgUyk7CiAgICAgICAgICAgIGFucyA9IChhbnMgKyBzdW0pICUgbW9kOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gKDIgKiBhbnMpICUgbW9kOwp9Cgp2b2lkIHNvbHZlKCkKewogICAgY2luID4+IG47CiAgICBjaW4gPj4gdDsKCiAgICBpbml0KCk7CgogICAgZm9yKGludCBpID0gMTsgaSA8PSBuOyBpKyspCiAgICAgICAgY2luID4+IGFbaV07CgogICAgdmVjdG9yPHB0PiBlZGdlOwoKICAgIGZvcihpbnQgaSA9IDE7IGkgPCBuOyBpKyspCiAgICB7CiAgICAgICAgaW50IHUsIHY7CgogICAgICAgIGNpbiA+PiB1OwogICAgICAgIGNpbiA+PiB2OwoKICAgICAgICBlZGdlLnB1c2hfYmFjayh7dSwgdiwgbWF4KGFbdV0sIGFbdl0pfSk7CiAgICB9CgogICAgc29ydChlZGdlLmJlZ2luKCksIGVkZ2UuZW5kKCkpOwoKICAgIERTVSBkc3UgKG4pOwoKICAgIGZvcihhdXRvIFt1LCB2LCB3XSA6IGVkZ2UpCiAgICB7CiAgICAgICAgaWYodyA+PSB0KQogICAgICAgICAgICBicmVhazsKCiAgICAgICAgZHN1LmpvaW4odSwgdik7CgogICAgICAgIGFkalt1XS5wdXNoX2JhY2sodik7CiAgICAgICAgYWRqW3ZdLnB1c2hfYmFjayh1KTsKICAgIH0KCiAgICBpbnQgdDEgPSBjYWwodCAtIDEsIGRzdSk7CgogICAgZm9yKGF1dG8gW3UsIHYsIHddIDogZWRnZSkKICAgIHsKICAgICAgICBpZih3ID4gdCkKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGlmKHcgIT0gdCkKICAgICAgICAgICAgY29udGludWU7CgogICAgICAgIGRzdS5qb2luKHUsIHYpOwoKICAgICAgICBhZGpbdV0ucHVzaF9iYWNrKHYpOwogICAgICAgIGFkalt2XS5wdXNoX2JhY2sodSk7CiAgICB9CgogICAgaW50IHQyID0gY2FsKHQsIGRzdSk7CgogICAgY291dCA8PCAodDIgLSB0MSArIG1vZCkgJSBtb2Q7CiAgICBjb3V0IDw8ICdcbic7Cn0KCnNpZ25lZCBtYWluKCkKewogICAgZmFzdGVyOwogICAgRjsKCiAgICBpbnQgdGVzdCA9IDE7CgovLyAgICBjaW4gPj4gdGVzdDsKCiAgICB3aGlsZSh0ZXN0LS0pCiAgICB7CiAgICAgICAgc29sdmUoKTsKICAgIH0KCiAgICBjZXJyIDw8ICJUaW1lIGVsYXBzZWQ6ICIgPDwgKDEuMCAqIGNsb2NrKCkgLyBDTE9DS1NfUEVSX1NFQykgPDwgIiBzLlxuIjsKCiAgICByZXR1cm4gMDsKfQoK