# Original solution
from collections import deque


n, m, k =list(map(int, input().split()))

g = []
# Init Graph
for _ in range(n):
    g.append(deque(list()))


bd = dict()
fd = dict()

directcount = [0] * n


for i in range(m):
    a, b = list(map(int, input().split()))
    a -= 1
    b -= 1
    g[a].append(b)
    g[b].append(a)
    directcount[a] += 1
    directcount[b] += 1
    fd[200000 * a + b] = True
    fd[200000 * b + a] = True

visited = [[-1, -1] for i in range(n)]
q = deque(list())
# dfs
for i in range(n):
    q.append(i)
    color = i
    cnt = 1
    while len(q) > 0:
        #print(q)
        nextnode = q.popleft() # 次の探索
        #print("next", nextnode)
        if visited[nextnode][0] != -1:
            #print("visited")
            continue
        visited[nextnode] = [color, cnt]
        q.extend(g[nextnode]) # nextnodeの辺を足す
        cnt += 1

colorcount = [-1] * n
# グループごとの色をカウント
for i in range(n):
    colorcount[visited[i][0]] = max(colorcount[visited[i][0]], visited[i][1])

#print(visited)
#print(colorcount)


res = [[visited[i][0], colorcount[visited[i][0]]] for i in range(n)]
#print(res)

for i in range(k):
    c, d = list(map(int, input().split()))
    c -= 1
    d -= 1
    if res[c][0] == res[d][0]:
        res[c][1] -= 1
        res[d][1] -= 1

output = []
for i in range(n):
    output.append(res[i][1] - directcount[i] - 1)

print((" ".join(list([str(x) for x in output]))))


# Optimized solution
class UnionFind():
    # 作りたい要素数nで初期化
    # 使用するインスタンス変数の初期化
    def __init__(self, n):
        self.n = n
        # root[x]<0ならそのノードが根かつその値が木の要素数
        # rootノードでその木の要素数を記録する
        self.root = [-1] * (n + 1)
        # 木をくっつける時にアンバランスにならないように調整する
        self.rnk = [0] * (n + 1)
 
    # ノードxのrootノードを見つける
    def Find_Root(self, x):
        if (self.root[x] < 0):
            return x
        else:
            # ここで代入しておくことで、後の繰り返しを避ける
            self.root[x] = self.Find_Root(self.root[x])
            return self.root[x]
 
    # 木の併合、入力は併合したい各ノード
    def Unite(self, x, y):
        # 入力ノードのrootノードを見つける
        x = self.Find_Root(x)
        y = self.Find_Root(y)
        # すでに同じ木に属していた場合
        if (x == y):
            return
            # 違う木に属していた場合rnkを見てくっつける方を決める
        elif (self.rnk[x] > self.rnk[y]):
            self.root[x] += self.root[y]
            self.root[y] = x
 
        else:
            self.root[y] += self.root[x]
            self.root[x] = y
            # rnkが同じ（深さに差がない場合）は1増やす
            if (self.rnk[x] == self.rnk[y]):
                self.rnk[y] += 1
 
    # xとyが同じグループに属するか判断
    def isSameGroup(self, x, y):
        return self.Find_Root(x) == self.Find_Root(y)
 
    # ノードxが属する木のサイズを返す
    def Count(self, x):
        return -self.root[self.Find_Root(x)]
 
    def members(self, x):
        root = self.Find_Root(x)
        return [i for i in range(self.n) if self.Find_Root(i) == root]
 
    def roots(self):
        return [i for i, x in enumerate(self.root) if x < 0]
 
    def group_count(self):
        return len(self.roots())
 
    def all_group_members(self):
        return {r: self.members(r) for r in self.roots()}
 
    def size(self, x):
        return -self.root[self.Find_Root(x)]
 
 
n, m, k = list(map(int, input().split()))
 
uf = UnionFind(n)
directcount = [0] * n
 
for i in range(m):
    a, b = list(map(int, input().split()))
    a -= 1
    b -= 1
    directcount[a] += 1
    directcount[b] += 1
    uf.Unite(a, b)
 
res = []
for _ in range(n):
    res.append( [0, -1] )
ures = []
 
for i in range(n):
    res[i][0] = uf.size(i) - directcount[i] -1
    res[i][1] = uf.Find_Root(i)
#print(res)
 
 
for i in range(k):
    c, d = list(map(int, input().split()))
    c -= 1
    d -= 1
    if res[c][1] == res[d][1]:
        res[c][0] -= 1
        res[d][0] -= 1
 
 
print((" ".join(list([str(x[0]) for x in res]))))