#include <algorithm>
#include <bitset>
#include <cassert>
#include <cmath>
#include <iostream>
#include <map>
#include <numeric>
#include <queue>
#include <set>
#include <string>
#include <vector>

// Acknowledgement: Special thanks to kyomukyomupurin, who developed this
// template.
template <class T, class U>
std::ostream& operator<<(std::ostream& os, const std::pair<T, U>& p) {
  return os << '(' << p.first << ", " << p.second << ')';
}

template <class T>
std::ostream& operator<<(std::ostream& os, const std::vector<T>& vec) {
  int n = 0;
  for (auto e : vec) os << (n++ ? ", " : "{") << e;
  return os << (n ? "}" : "{}");
}

template <class T>
std::ostream& operator<<(std::ostream& os, const std::set<T>& st) {
  int n = 0;
  for (auto e : st) os << (n++ ? ", " : "{") << e;
  return os << (n ? "}" : "{}");
}

template <class T, class U>
std::ostream& operator<<(std::ostream& os, const std::map<T, U>& mp) {
  int n = 0;
  for (auto e : mp) os << (n++ ? ", " : "{") << e;
  return os << (n ? "}" : "{}");
}

template <class T>
std::istream& operator>>(std::istream& is, std::vector<T>& vec) {
  for (T& e : vec) is >> e;
  return is;
}

#ifdef LOCAL
#define debug(...) \
  std::cerr << "[" << #__VA_ARGS__ << "]: ", debug_out(__VA_ARGS__)
#else
#define debug(...)
#endif

void debug_out() { std::cerr << '\n'; }

template <class Head, class... Tail>
void debug_out(Head&& head, Tail&&... tail) {
  std::cerr << head;
  if (sizeof...(Tail) != 0) std::cerr << ", ";
  debug_out(std::forward<Tail>(tail)...);
}
using namespace std;
using int64 = long long;

void bfs(vector<vector<int>>& G, vector<vector<int>>& block, int start_node_id,
         vector<int>& color) {
  int u;
  // friend なら 1, block なら 2 を代入する配列
  vector<int> f(color.size());
  for (int i = 0; i < (int)G[start_node_id].size(); i++) {
    f[G[start_node_id][i]] = 1;
  }
  for (int i = 0; i < (int)block[start_node_id].size(); i++) {
    f[block[start_node_id][i]] = 2;
  }
  queue<int> q;
  color[start_node_id] = 1;
  q.push(start_node_id);
  int cnt = 0;
  while (!q.empty()) {
    u = q.front();
    q.pop();
    // if (color[u] == 2) continue;
    for (int i = 0; i < (int)G[u].size(); i++) {
      int v = G[u][i];
      if (color[v] == 0) {
        q.push(v);
        if (f[v] == 1)
          color[v] = 3;
        else if (f[v] == 2)
          color[v] = 2;
        else {
          color[v] = 1;
          cnt++;
        }
      }
    }
    if (f[u] == 1)
      color[u] = 3;
    else if (f[u] == 2)
      color[u] = 2;
    else {
      if (color[u] != 1) cnt++;
      color[u] = 1;
    }
  }
  cout << cnt;
}

void dfs(int start_node_id, vector<vector<int>>& g, vector<int>& visit_status,
         vector<int>& first_visit, vector<int>& last_visit, int& time,
         int col) {
  visit_status[start_node_id] = col;
  first_visit[start_node_id] = ++time;
  for (int i = 0; i < (int)g[start_node_id].size(); i++) {
    int node_id = g[start_node_id][i];
    if (visit_status[node_id] == 0) {
      dfs(node_id, g, visit_status, first_visit, last_visit, time, col);
    }
  }
  visit_status[start_node_id] = col;
  last_visit[start_node_id] = ++time;
}

int main() {
  int N, M, K;
  cin >> N >> M >> K;
  vector<vector<int>> g(N);
  vector<vector<int>> block(N);
  int a, b, c, d;
  for (int i = 0; i < M; i++) {
    cin >> a >> b;
    g[a - 1].push_back(b - 1);
    g[b - 1].push_back(a - 1);
  }
  for (int i = 0; i < K; i++) {
    cin >> c >> d;
    block[c - 1].push_back(d - 1);
    block[d - 1].push_back(c - 1);
  }
  vector<int> visit_status(N), first_visit(N), last_visit(N);
  int time = 0;
  int col = 1;
  for (int i = 0; i < N; i++) {
    if (visit_status[i] == 0) {
      dfs(i, g, visit_status, first_visit, last_visit, time, col);
      col++;
    }
  }
  debug(visit_status);
  int num_group = col - 1;
  vector<set<int>> group(num_group);
  for (int i = 0; i < N; i++) {
    group[visit_status[i] - 1].insert(i);
  }
  vector<int> ans(N);
  for (int i = 0; i < N; i++) {
    int block_in_group = 0;
    for (auto v : block[i]) {
      if (group[visit_status[i] - 1].count(v)) block_in_group++;
    }
    cout << group[visit_status[i] - 1].size() - g[i].size() - block_in_group - 1
         << ' ';
  }
  cout << endl;
  return 0;
}

Measured memory_bytes: 23204