import java.util.*;

public class akashm153 {
    public static Scanner sc;

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        int n = sc.nextInt();
        int k = sc.nextInt();

        int[] values = new int[n];

        Map<Integer, Long> freqs_total = new HashMap<>();
        for (int i = 0; i < n; i++) {
            values[i] = sc.nextInt();
            freqs_total.put(values[i], freqs_total.getOrDefault(values[i], 0L) + 1);
        }

        long ans = 0;
        for (int a : freqs_total.keySet()) {
            ans += (freqs_total.getOrDefault(a + k, 0L) * freqs_total.getOrDefault(a, 0L));
        }
        ans *= 2;

        ArrayList<ArrayList<Integer>> edges = new ArrayList<>();
        for (int i = 0; i < n; i++) {
            edges.add(new ArrayList<>());
        }

        int[] degrees = new int[n];
        for (int i = 0; i < n; i++) {
            degrees[i] = 0;
        }
        Queue<Integer> q = new ArrayDeque<>();

        for (int i = 0; i < n; i++) {
            int a = sc.nextInt() - 1;
            int b = sc.nextInt() - 1;
            edges.get(a).add(b);
            edges.get(b).add(a);

            degrees[a] += 1;
            degrees[b] += 1;
        }

        for (int i = 0; i < n; i++) {
            if (degrees[i] == 1)
                q.add(i);
        }

        while (!q.isEmpty()) {
            int curr = q.poll();

            for (int adj : edges.get(curr)) {
                if (degrees[adj] > 0) {
                    degrees[adj] -= 1;
                    if (degrees[adj] == 1) {
                        q.add(adj);
                    }
                }
            }
        }

        // now we build all the different trees. just figuring out frequency of values
        // in each tree

        ArrayList<Integer> roots = new ArrayList<>();
        ArrayList<Map<Integer, Long>> freqs_by_tree = new ArrayList<>();
        boolean[] visited = new boolean[n];

        for (int i = 0; i < n; i++) {
            visited[i] = false;
        }

        for (int i = 0; i < n; i++) {
            if (degrees[i] > 1) {
                Map<Integer, Long> curr_map = new HashMap<>();

                Queue<Integer> left = new ArrayDeque<>();
                left.add(i);

                while (!left.isEmpty()) {
                    int curr = left.poll();
                    visited[curr] = true;
                    curr_map.put(values[curr], curr_map.getOrDefault(values[curr], 0L) + 1);

                    for (int adj : edges.get(curr)) {
                        if ((!visited[adj]) && (degrees[adj] < 2)) {
                            left.add(adj);
                        }
                    }
                }

                freqs_by_tree.add(curr_map);
            }
        }

        for (int i = 0; i < freqs_by_tree.size(); i++) {
            // System.out.println("Tree " + i + ": " + freqs_by_tree.get(i));
            for (int a : freqs_by_tree.get(i).keySet()) {
                ans -= (freqs_by_tree.get(i).getOrDefault(a + k, 0L) * freqs_by_tree.get(i).getOrDefault(a, 0L));
            }
        }

        System.out.println(ans);
        sc.close();
    }
}