#include <bits/stdc++.h>
using namespace std;

// Loops
#define _overload3(_1, _2, _3, name, ...) name
#define _rep(i, n) repi(i, 0, n)
#define repi(i, a, b) for (int i = int(a); i < int(b); ++i)
#define _rrep(i, n) rrepi(i, n, 0)
#define rrepi(i, a, b) for (int i = int(a) - 1; i >= int(b); --i)

#define rep(...) _overload3(__VA_ARGS__, repi, _rep, )(__VA_ARGS__)
#define rrep(...) _overload3(__VA_ARGS__, rrepi, _rrep, )(__VA_ARGS__)
#define each(xi, x) for (auto &&xi : x)
// Note: we can use rep(i,N) or rep(i,from,to)

// typedef
template <class T> using vec = vector<T>;
using ll = long long;
using vi = vec<ll>;
using vvi = vec<vi>;
using vvvi = vec<vvi>;
using pii = pair<ll, ll>;

// Constants

// Shorter repr for frequently used terms
#define pb push_back
#define mp make_pair

// Algorithms
#define all(x) (x).begin(), (x).end()
#define uniq(v) v.erase(unique(all(v)), v.end())
#define perm(c)                                                                \
  sort(all(c));                                                                \
  for (bool c##p = 1; c##p; c##p = next_permutation(all(c)))

template <class T> pair<T, size_t> max(vector<T> &x) {
  auto it = max_element(all(x));
  return mp(*it, it - x.begin());
}
template <class T> pair<T, size_t> min(vector<T> &x) {
  auto it = min_element(all(x));
  return mp(*it, it - x.begin());
}

template <class T> inline bool chmax(T &maxval, const T &newval) {
  if (maxval < newval) {
    maxval = newval;
    return 1;
  }
  return 0;
}
template <class T> inline bool chmin(T &minval, const T &newval) {
  if (minval > newval) {
    minval = newval;
    return 1;
  }
  return 0;
}

// Utilities
// Grid world utilities
int dx[4] = {0, 1, 0, -1};
int dy[4] = {1, 0, -1, 0};
#define inside(H, W, y, x) 0 <= (x) && (x) < (W) && 0 <= (y) && (y) < (H)

// Debug
#ifdef LOCAL
#include "dump.hpp"
#define debug(x) cerr << #x << ": " << x << '\n'
#else
#define dump(...)
#define debug(x)
#endif

// Paste snippets here!!
struct UnionFind {
  int n;
  std::vector<int> par;
  std::vector<int> rank;
  UnionFind(int n_) : par(n_), rank(n_,0), n(n_) { for(int i=0;i<n;++i) par[i] = i; }
  int root(int x) { return par[x] == x ? x : (par[x]=root(par[x])); }
  bool same(int x, int y) { return root(x)==root(y); }
  void unite(int x, int y) {
    x = root(x); y = root(y);
    if(x==y) return;
    if(rank[x] < rank[y]) par[x] = y;
    else {
      par[y] = x;
      if(rank[x]==rank[y]) rank[x]++;
    }
  }
  int count_groups() const { int cnt = 0; for(int x=0; x<par.size(); ++x) if(x==par[x]) cnt++; return cnt; }
};

//

void solve(long long N, long long M, long long K, std::vector<long long> A,
           std::vector<long long> B, std::vector<long long> C,
           std::vector<long long> D)
{
  UnionFind S(N);
  unordered_map<ll, vec<ll>> friends;
  rep(i,M){
    A[i]--; B[i]--;
    S.unite(A[i],B[i]);
    friends[A[i]].push_back(B[i]);
    friends[B[i]].push_back(A[i]);
  }
  unordered_map<ll, vec<ll>> block;
  rep(i,K){
    C[i]--; D[i]--;
    block[C[i]].push_back(D[i]);
    block[D[i]].push_back(C[i]);
  }
  rep(i,N){
    S.root(i);
  }
  unordered_map<ll,ll> group_size;
  rep(i,N){
    group_size[S.root(i)]++;
  }
  rep(i,N){
    ll ret = group_size[S.root(i)] - 1;
    for(int j : block[i]){
      if(S.same(i,j)){
        ret--;
      }
    }
    ret -= friends[i].size(); 
    cout << ret;
    if(i<N-1) cout << " ";
    else cout << endl;
  }
}

int main() {
  cin.tie(0);
  ios::sync_with_stdio(false); // Magic for faster cin
  cout.precision(12);
  long long N;
  std::cin >> N;
  long long M;
  std::cin >> M;
  long long K;
  std::cin >> K;
  std::vector<long long> A(M);
  std::vector<long long> B(M);
  for (int i = 0; i < M; i++) {
    std::cin >> A[i];
    std::cin >> B[i];
  }
  std::vector<long long> C(K);
  std::vector<long long> D(K);
  for (int i = 0; i < K; i++) {
    std::cin >> C[i];
    std::cin >> D[i];
  }
  solve(N, M, K, std::move(A), std::move(B), std::move(C), std::move(D));
  return 0;
}


Measured memory_bytes: 27928