#include <bits/stdc++.h>
using namespace std;
class UnionFind {
 public:
  vector<long long> par;
  vector<long long> siz;
  UnionFind(long long sz_) : par(sz_), siz(sz_, 1LL) {
    for (long long i = 0; i < sz_; ++i) par[i] = i;
  }
  void init(long long sz_) {
    par.resize(sz_);
    siz.assign(sz_, 1LL);
    for (long long i = 0; i < sz_; ++i) par[i] = i;
  }
  long long root(long long x) {
    while (par[x] != x) {
      x = par[x] = par[par[x]];
    }
    return x;
  }
  bool merge(long long x, long long y) {
    x = root(x);
    y = root(y);
    if (x == y) return false;
    if (siz[x] < siz[y]) swap(x, y);
    siz[x] += siz[y];
    par[y] = x;
    return true;
  }
  bool issame(long long x, long long y) { return root(x) == root(y); }
  long long size(long long x) { return siz[root(x)]; }
};
int main(void) {
  long long n, m, k;
  cin >> n >> m >> k;
  long long c[n];
  for (long long i = 0; i < n; ++i) {
    c[i] = 0;
  }
  UnionFind a(n);
  a.init(n);
  for (long long i = 0; i < m; ++i) {
    long long x, y;
    cin >> x >> y;
    --x, --y;
    a.merge(x, y);
    ++c[x];
    ++c[y];
  }
  for (long long j = 0; j < k; ++j) {
    long long x, y;
    cin >> x >> y;
    --x, --y;
    if (a.issame(x, y)) {
      ++c[x];
      ++c[y];
    }
  }
  for (long long i = 0; i < n; ++i) {
  }
  for (long long i = 0; i < n; ++i) {
    cout << a.size(i) - 1 - c[i];
    if (i == n - 1)
      cout << endl;
    else
      cout << " ";
  }
}
