#include <bits/stdc++.h>
using namespace std;
struct wie {
  int m, il;
};
vector<wie> T;
vector<int> L;
int l, size;
const int INF = 1000000000;
wie Merge(wie a, wie b) {
  wie c = {min(a.m, b.m), 0};
  if (a.m == c.m) c.il += a.il;
  if (b.m == c.m) c.il += b.il;
  return c;
}
void Propaguj(int akt) {
  T[2 * akt].m += L[akt];
  T[2 * akt + 1].m += L[akt];
  L[2 * akt] += L[akt];
  L[2 * akt + 1] += L[akt];
  L[akt] = 0;
}
void Stworz(int n) {
  int p = 1;
  while (p < n) p *= 2;
  l = p;
  size = 2 * p - 1;
  for (int i = 0; i <= size; ++i) {
    T.push_back({0, 1});
    L.push_back(0);
  }
  for (int i = l - 1; i >= 1; --i) T[i] = Merge(T[2 * i], T[2 * i + 1]);
}
void Dodaj(int akt, int Le, int Pr, int l, int p, int x) {
  if (Le == l && Pr == p) {
    T[akt].m += x;
    L[akt] += x;
    return;
  }
  Propaguj(akt);
  int Sr = (Le + Pr) / 2;
  if (max(Le, l) <= min(Sr, p))
    Dodaj(2 * akt, Le, Sr, max(Le, l), min(Sr, p), x);
  if (max(Sr + 1, l) <= min(Pr, p))
    Dodaj(2 * akt + 1, Sr + 1, Pr, max(Sr + 1, l), min(Pr, p), x);
  T[akt] = Merge(T[2 * akt], T[2 * akt + 1]);
}
wie Pyt(int akt, int Le, int Pr, int l, int p) {
  if (Le == l && Pr == p) return T[akt];
  Propaguj(akt);
  int Sr = (Le + Pr) / 2;
  wie w = {INF, 0};
  if (max(Le, l) <= min(Sr, p))
    w = Merge(w, Pyt(2 * akt, Le, Sr, max(Le, l), min(Sr, p)));
  if (max(Sr + 1, l) <= min(Pr, p))
    w = Merge(w, Pyt(2 * akt + 1, Sr + 1, Pr, max(Sr + 1, l), min(Pr, p)));
  return w;
}
int nr = 0;
void dfs(int akt, int oj, vector<vector<int> >& T, vector<int>& pre,
         vector<int>& wlk) {
  pre[akt] = nr;
  ++nr;
  for (int i = 0; i < T[akt].size(); ++i)
    if (T[akt][i] != oj) dfs(T[akt][i], akt, T, pre, wlk);
  wlk[akt] = 1;
  for (int i = 0; i < T[akt].size(); ++i)
    if (T[akt][i] != oj) wlk[akt] += wlk[T[akt][i]];
}
int main() {
  ios_base::sync_with_stdio(0);
  int n, m;
  cin >> n >> m;
  vector<vector<int> > T(n);
  for (int i = 0; i < n - 1; ++i) {
    int a, b;
    cin >> a >> b;
    --a;
    --b;
    T[a].push_back(b);
    T[b].push_back(a);
  }
  vector<int> pre(n), wlk(n);
  dfs(0, -1, T, pre, wlk);
  vector<int> gdziePre(n);
  for (int i = 0; i < n; ++i) gdziePre[pre[i]] = i;
  vector<vector<int> > prz(m);
  vector<vector<int> > pocz(n), kon(n);
  for (int i = 0; i < m; ++i) {
    int a, b;
    cin >> a >> b;
    --a;
    --b;
    int l1 = pre[a], p1 = pre[a] + wlk[a] - 1;
    int l2 = pre[b], p2 = pre[b] + wlk[b] - 1;
    if (l2 >= l1 && p2 <= p1) {
      prz[i].push_back(l1);
      prz[i].push_back(p1);
      pocz[l1].push_back(i);
      kon[p1].push_back(i);
      continue;
    }
    if (l1 >= l2 && p1 <= p2) {
      prz[i].push_back(l2);
      prz[i].push_back(p2);
      pocz[l2].push_back(i);
      kon[p2].push_back(i);
      continue;
    }
    prz[i].push_back(l1);
    prz[i].push_back(p1);
    prz[i].push_back(l2);
    prz[i].push_back(p2);
    pocz[l1].push_back(i);
    kon[p1].push_back(i);
    pocz[l2].push_back(i);
    kon[p2].push_back(i);
  }
  Stworz(n);
  vector<int> odp(n);
  for (int i = 0; i < n; ++i) {
    for (int j = 0; j < pocz[i].size(); ++j) {
      int nr = pocz[i][j];
      if (prz[nr].size() == 2)
        Dodaj(1, 0, size - l, prz[nr][0], prz[nr][1], 1);
      else {
        Dodaj(1, 0, size - l, prz[nr][0], prz[nr][1], 1);
        Dodaj(1, 0, size - l, prz[nr][2], prz[nr][3], 1);
      }
    }
    if (Pyt(1, 0, size - l, i, i).m == 0)
      odp[gdziePre[i]] = 0;
    else {
      wie w = Pyt(1, 0, size - l, 0, n - 1);
      if (w.m == 0)
        odp[gdziePre[i]] = n - w.il - 1;
      else
        odp[gdziePre[i]] = n - 1;
    }
    for (int j = 0; j < kon[i].size(); ++j) {
      int nr = kon[i][j];
      if (prz[nr].size() == 2)
        Dodaj(1, 0, size - l, prz[nr][0], prz[nr][1], -1);
      else {
        Dodaj(1, 0, size - l, prz[nr][0], prz[nr][1], -1);
        Dodaj(1, 0, size - l, prz[nr][2], prz[nr][3], -1);
      }
    }
  }
  for (int i = 0; i < n; ++i) cout << odp[i] << " ";
  return 0;
}
