class UnionFind:

    def __init__(self, n):

        # 親要素のノード番号を格納　par[x] == x の時そのノードは根

        self.par = [i for i in range(n+1)]

        # 木の高さを格納する（初期状態では0)

        self.rank = [0] * (n+1)

        # 各々の集合の要素数（根が代表して値を持っておく）

        self.count = [1] * (n+1)



    # 検索

    def find(self, x):

        # 根ならその番号を返す

        if self.par[x] == x:

            return x

        # 根でないなら親の要素で再検索

        else:

            # 検索する過程で親を更新

            self.par[x] = self.find(self.par[x])

            return self.par[x]



    # 併合

    def union(self, x, y):

        if UnionFind.same_check(self,x,y):

            return

        x = self.find(x)

        y = self.find(y)

        t = (x == y)

        if self.rank[x] < self.rank[y]:

            self.par[x] = y

            self.count[y] += self.count[x]

            self.count[x] = 0

        else:

            self.par[y] = x

            self.count[x] += self.count[y]

            self.count[y] = 0

            if self.rank[x] == self.rank[y]:

                self.rank[x] += 1

        return t





    # 同じ集合に属しているか判定

    def same_check(self, x, y):

        return self.find(x) == self.find(y)



    # 属している集合の要素数

    def size(self,x):

        q = UnionFind.find(self,x)

        return self.count[q]



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

u = UnionFind(n)

ans = [-1 for i in range(n)]

for i in range(m):

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

    a -= 1

    b -= 1

    ans[a] -= 1

    ans[b] -= 1

    u.union(a,b)

#print(*ans)

for i in range(k):

    c,d = list(map(int,input().split()))

    c -= 1

    d -= 1

    if u.same_check(c,d):

        ans[c] -= 1

        ans[d] -= 1



print((*[u.size(i)+x for i,x in enumerate(ans)]))
class UnionFind:

    def __init__(self, n):

        # 親要素のノード番号を格納　par[x] == x の時そのノードは根

        self.par = [i for i in range(n+1)]

        # 木の高さを格納する（初期状態では0)

        self.rank = [0] * (n+1)

        # 各々の集合の要素数（根が代表して値を持っておく）

        self.count = [1] * (n+1)



    # 検索

    def find(self, x):

        # 根ならその番号を返す

        root = x

        queue = [x]

        data = []

        while queue:

            now = queue.pop()

            if self.par[now] == now:

                root = now

            else:

                # 根でないなら親の要素で再検索

                data.append(now)

                queue.append(self.par[now])

        # 検索する過程で親を更新

        #for y in data:

            #self.par[y] = root

        return root



    # 併合

    def union(self, x, y):

        x = self.find(x)

        y = self.find(y)

        t = (x == y)

        if UnionFind.same_check(self,x,y):

            return t

        if self.rank[x] < self.rank[y]:

            self.par[x] = y

            self.count[y] += self.count[x]

            self.count[x] = 0

        else:

            self.par[y] = x

            self.count[x] += self.count[y]

            self.count[y] = 0

            if self.rank[x] == self.rank[y]:

                self.rank[x] += 1

        return t





    # 同じ集合に属しているか判定

    def same_check(self, x, y):

        return self.find(x) == self.find(y)



    # 属している集合の要素数

    def size(self,x):

        q = UnionFind.find(self,x)

        return self.count[q]



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

u = UnionFind(n)

ans = [-1 for i in range(n)]

for i in range(m):

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

    a -= 1

    b -= 1

    ans[a] -= 1

    ans[b] -= 1

    u.union(a,b)

#print(*ans)

for i in range(k):

    c,d = list(map(int,input().split()))

    c -= 1

    d -= 1

    if u.same_check(c,d):

        ans[c] -= 1

        ans[d] -= 1



print((*[u.size(i)+x for i,x in enumerate(ans)]))
class UnionFind:
    def __init__(self, n):
        # 親要素のノード番号を格納　par[x] == x の時そのノードは根
        self.par = [i for i in range(n + 1)]
        # 木の高さを格納する（初期状態では0)
        self.rank = [0] * (n + 1)
        # 各々の集合の要素数（根が代表して値を持っておく）
        self.count = [1] * (n + 1)

    # 検索
    def find(self, x):
        # 根ならその番号を返す
        if self.par[x] == x:
            return x
        # 根でないなら親の要素で再検索
        else:
            # 検索する過程で親を更新
            self.par[x] = self.find(self.par[x])
            return self.par[x]

    # 併合
    def union(self, x, y):
        if UnionFind.same_check(self, x, y):
            return
        x = self.find(x)
        y = self.find(y)
        t = x == y
        if self.rank[x] < self.rank[y]:
            self.par[x] = y
            self.count[y] += self.count[x]
            self.count[x] = 0
        else:
            self.par[y] = x
            self.count[x] += self.count[y]
            self.count[y] = 0
            if self.rank[x] == self.rank[y]:
                self.rank[x] += 1
        return t

    # 同じ集合に属しているか判定
    def same_check(self, x, y):
        return self.find(x) == self.find(y)

    # 属している集合の要素数
    def size(self, x):
        q = UnionFind.find(self, x)
        return self.count[q]


n, m, k = list(map(int, input().split()))
u = UnionFind(n)
ans = [-1 for i in range(n)]
for i in range(m):
    a, b = list(map(int, input().split()))
    a -= 1
    b -= 1
    ans[a] -= 1
    ans[b] -= 1
    u.union(a, b)
# print(*ans)
for i in range(k):
    c, d = list(map(int, input().split()))
    c -= 1
    d -= 1
    if u.same_check(c, d):
        ans[c] -= 1
        ans[d] -= 1
print((*[u.size(i) + x for i, x in enumerate(ans)]))

class UnionFind:
    def __init__(self, n):
        # 親要素のノード番号を格納　par[x] == x の時そのノードは根
        self.par = [i for i in range(n + 1)]
        # 木の高さを格納する（初期状態では0)
        self.rank = [0] * (n + 1)
        # 各々の集合の要素数（根が代表して値を持っておく）
        self.count = [1] * (n + 1)

    # 検索
    def find(self, x):
        # 根ならその番号を返す
        root = x
        queue = [x]
        data = []
        while queue:
            now = queue.pop()
            if self.par[now] == now:
                root = now
            else:
                # 根でないなら親の要素で再検索
                data.append(now)
                queue.append(self.par[now])
        # 検索する過程で親を更新
        # for y in data:
        # self.par[y] = root
        return root

    # 併合
    def union(self, x, y):
        x = self.find(x)
        y = self.find(y)
        t = x == y
        if UnionFind.same_check(self, x, y):
            return t
        if self.rank[x] < self.rank[y]:
            self.par[x] = y
            self.count[y] += self.count[x]
            self.count[x] = 0
        else:
            self.par[y] = x
            self.count[x] += self.count[y]
            self.count[y] = 0
            if self.rank[x] == self.rank[y]:
                self.rank[x] += 1
        return t

    # 同じ集合に属しているか判定
    def same_check(self, x, y):
        return self.find(x) == self.find(y)

    # 属している集合の要素数
    def size(self, x):
        q = UnionFind.find(self, x)
        return self.count[q]


n, m, k = list(map(int, input().split()))
u = UnionFind(n)
ans = [-1 for i in range(n)]
for i in range(m):
    a, b = list(map(int, input().split()))
    a -= 1
    b -= 1
    ans[a] -= 1
    ans[b] -= 1
    u.union(a, b)
# print(*ans)
for i in range(k):
    c, d = list(map(int, input().split()))
    c -= 1
    d -= 1
    if u.same_check(c, d):
        ans[c] -= 1
        ans[d] -= 1
print((*[u.size(i) + x for i, x in enumerate(ans)]))

-        if self.par[x] == x: -            return x -        # 根でないなら親の要素で再検索 -        else: -            # 検索する過程で親を更新 -            self.par[x] = self.find(self.par[x]) -            return self.par[x] +        root = x +        queue = [x] +        data = [] +        while queue: +            now = queue.pop() +            if self.par[now] == now: +                root = now +            else: +                # 根でないなら親の要素で再検索 +                data.append(now) +                queue.append(self.par[now]) +        # 検索する過程で親を更新 +        # for y in data: +        # self.par[y] = root +        return root -        if UnionFind.same_check(self, x, y): -            return +        if UnionFind.same_check(self, x, y): +            return t