#include <bits/stdc++.h>
using namespace std;
namespace aigo {
template <typename T = int>
class UnionFind {
 public:
  UnionFind(T n) : _par(n), _size(n, T{1}) {
    for (T i{}; i < n; i++) {
      _par[i] = i;
    }
  }
  bool unite(T x, T y) {
    x = root(x);
    y = root(y);
    if (x == y) return false;
    if (_size[x] < _size[y]) {
      std::swap(x, y);
    } else {
      _size[x] += _size[y];
      _par[y] = x;
    }
    return true;
  }
  bool isSame(int x, int y) { return root(x) == root(y); }
  T size(T x) { return _size[root(x)]; }
  void print() const {
    for (ssize_t i = 0; i < std::max(_par.size(), _size.size()); i++) {
      std::cout << _par[i] << ", " << _size[i] << std::endl;
    }
  }

 private:
  std::vector<T> _par;
  std::vector<T> _size;
  T root(T x) {
    if (_par[x] == x) {
      return x;
    } else {
      return _par[x] = root(_par[x]);
    }
  }
};
}  // namespace aigo
int main() {
  using namespace aigo;
  int n, m, k;
  cin >> n >> m >> k;
  UnionFind<int> uf(n);
  vector<set<int>> dame(n);
  for (int i = (0); i < (m); ++i) {
    int a, b;
    cin >> a >> b;
    --a;
    --b;
    uf.unite(a, b);
    dame[a].insert(b);
    dame[b].insert(a);
  }
  for (int i = (0); i < (k); ++i) {
    int c, d;
    cin >> c >> d;
    --c;
    --d;
    if (!uf.isSame(c, d)) continue;
    dame[c].insert(d);
    dame[d].insert(c);
  }
  for (int i = (0); i < (n); ++i) {
    int res = uf.size(i) - dame[i].size() - 1;
    cout << res << " ";
  }
  cout << endl;
  return 0;
}
