import sys

from io import StringIO

import unittest



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 resolve():

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



    uf = UnionFind(n)



    res=[[] for i in range(n)]

    frd=[0 for i in range(n)]

    blk=[0 for i in range(n)]



    for i in range(m):

        a,b=list(map(int,input().strip().split()))

        a-=1

        b-=1

        uf.Unite(a,b)

        frd[a]+=1

        frd[b]+=1

    

    for i in range(k):

        a,b=list(map(int,input().strip().split()))

        a-=1

        b-=1

        if uf.isSameGroup(a,b):

            blk[a]+=1

            blk[b]+=1

    

    rescnt=[]



    for i in range(n):

        ri=uf.Count(i)-1-blk[i]-frd[i]

        rescnt.append(str(ri))

        ##rescnt.append(str(n-uf.size(i)-len(blk[i])))

    

    print((" ".join(rescnt)))



resolve()
import sys

from io import StringIO

read = sys.stdin.buffer.read

readline = sys.stdin.buffer.readline

readlines = sys.stdin.buffer.readlines

import unittest



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 resolve():

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

    #list(map(int,input().strip().split()))



    uf = UnionFind(n)



    res=[[] for i in range(n)]

    frd=[0 for i in range(n)]

    blk=[0 for i in range(n)]



    for i in range(m):

        #a,b=list(map(int,input().strip().split()))

        a,b=list(map(int, readline().split()))

        a-=1

        b-=1

        uf.Unite(a,b)

        frd[a]+=1

        frd[b]+=1

    

    for i in range(k):

        #a,b=list(map(int,input().strip().split()))

        a,b=list(map(int, readline().split()))

        a-=1

        b-=1

        if uf.isSameGroup(a,b):

            blk[a]+=1

            blk[b]+=1

    

    rescnt=[]



    for i in range(n):

        ri=uf.Count(i)-1-blk[i]-frd[i]

        rescnt.append(str(ri))

        ##rescnt.append(str(n-uf.size(i)-len(blk[i])))

    

    print((" ".join(rescnt)))



resolve()
import sys
from io import StringIO
import unittest


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 resolve():
    n, m, k = list(map(int, input().strip().split()))
    uf = UnionFind(n)
    res = [[] for i in range(n)]
    frd = [0 for i in range(n)]
    blk = [0 for i in range(n)]
    for i in range(m):
        a, b = list(map(int, input().strip().split()))
        a -= 1
        b -= 1
        uf.Unite(a, b)
        frd[a] += 1
        frd[b] += 1
    for i in range(k):
        a, b = list(map(int, input().strip().split()))
        a -= 1
        b -= 1
        if uf.isSameGroup(a, b):
            blk[a] += 1
            blk[b] += 1
    rescnt = []
    for i in range(n):
        ri = uf.Count(i) - 1 - blk[i] - frd[i]
        rescnt.append(str(ri))
        ##rescnt.append(str(n-uf.size(i)-len(blk[i])))
    print((" ".join(rescnt)))


resolve()

import sys
from io import StringIO

read = sys.stdin.buffer.read
readline = sys.stdin.buffer.readline
readlines = sys.stdin.buffer.readlines
import unittest


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 resolve():
    n, m, k = list(map(int, readline().split()))
    # list(map(int,input().strip().split()))
    uf = UnionFind(n)
    res = [[] for i in range(n)]
    frd = [0 for i in range(n)]
    blk = [0 for i in range(n)]
    for i in range(m):
        # a,b=list(map(int,input().strip().split()))
        a, b = list(map(int, readline().split()))
        a -= 1
        b -= 1
        uf.Unite(a, b)
        frd[a] += 1
        frd[b] += 1
    for i in range(k):
        # a,b=list(map(int,input().strip().split()))
        a, b = list(map(int, readline().split()))
        a -= 1
        b -= 1
        if uf.isSameGroup(a, b):
            blk[a] += 1
            blk[b] += 1
    rescnt = []
    for i in range(n):
        ri = uf.Count(i) - 1 - blk[i] - frd[i]
        rescnt.append(str(ri))
        ##rescnt.append(str(n-uf.size(i)-len(blk[i])))
    print((" ".join(rescnt)))


resolve()

+ +read = sys.stdin.buffer.read +readline = sys.stdin.buffer.readline +readlines = sys.stdin.buffer.readlines -    n, m, k = list(map(int, input().strip().split())) +    n, m, k = list(map(int, readline().split())) +    # list(map(int,input().strip().split())) -        a, b = list(map(int, input().strip().split())) +        # a,b=list(map(int,input().strip().split())) +        a, b = list(map(int, readline().split())) -        a, b = list(map(int, input().strip().split())) +        # a,b=list(map(int,input().strip().split())) +        a, b = list(map(int, readline().split()))