#

n = int(eval(input()))

s = []

for _ in range(n):

    #s.append(list(input())) # !!!

    #s.append(sorted(list(input()))) # !!!

    #s.append(sorted(input())) # !!!

    s.append([''.join(sorted(eval(input())))])

    #s += [''.join(sorted(input()))]

    #''.join(sorted((sorted(input()))

s = sorted(s)

#print(s)



a = []

x = 1

for i in range(1,n):

    if s[i] == s[i-1]:

        x += 1

    else:

        a.append(x)

        x = 1

else:

    a.append(x)

#print(a)



y = 0

for j in a:

    y += j*(j-1)/2



print((int(y)))

# 2回目のソートに気づけずTLE、納得のアルゴリズム

n = int(eval(input()))

s = []

for _ in range(n): #文字列の各要素をソートしリストに格納

    #s.append(list(input())) # !!!

    #s.append(sorted(list(input()))) # !!!

    #s.append(sorted(input())) # !!!

    #s.append([''.join(sorted(input()))])

    s += [''.join(sorted(eval(input())))] # appendよりも'+='の方が高速！

s = sorted(s) #さらにソートして全検索を避ける

#print(s)



a = []

x = 1

for i in range(1,n): #隣り合う要素が重複する数をリストに格納

    if s[i] == s[i-1]:

        x += 1

    else:

        a.append(x)

        x = 1

else:

    a.append(x)

#print(a)



y = 0

for j in a: #各重複する数から各組み合わせ数を返し合算

    y += j*(j-1)/2



print((int(y)))

#
n = int(eval(input()))
s = []
for _ in range(n):
    # s.append(list(input())) # !!!
    # s.append(sorted(list(input()))) # !!!
    # s.append(sorted(input())) # !!!
    s.append(["".join(sorted(eval(input())))])
    # s += [''.join(sorted(input()))]
    #''.join(sorted((sorted(input()))
s = sorted(s)
# print(s)
a = []
x = 1
for i in range(1, n):
    if s[i] == s[i - 1]:
        x += 1
    else:
        a.append(x)
        x = 1
else:
    a.append(x)
# print(a)
y = 0
for j in a:
    y += j * (j - 1) / 2
print((int(y)))

# 2回目のソートに気づけずTLE、納得のアルゴリズム
n = int(eval(input()))
s = []
for _ in range(n):  # 文字列の各要素をソートしリストに格納
    # s.append(list(input())) # !!!
    # s.append(sorted(list(input()))) # !!!
    # s.append(sorted(input())) # !!!
    # s.append([''.join(sorted(input()))])
    s += ["".join(sorted(eval(input())))]  # appendよりも'+='の方が高速！
s = sorted(s)  # さらにソートして全検索を避ける
# print(s)
a = []
x = 1
for i in range(1, n):  # 隣り合う要素が重複する数をリストに格納
    if s[i] == s[i - 1]:
        x += 1
    else:
        a.append(x)
        x = 1
else:
    a.append(x)
# print(a)
y = 0
for j in a:  # 各重複する数から各組み合わせ数を返し合算
    y += j * (j - 1) / 2
print((int(y)))

-# +# 2回目のソートに気づけずTLE、納得のアルゴリズム -for _ in range(n): +for _ in range(n):  # 文字列の各要素をソートしリストに格納 -    s.append(["".join(sorted(eval(input())))]) -    # s += [''.join(sorted(input()))] -    #''.join(sorted((sorted(input())) -s = sorted(s) +    # s.append([''.join(sorted(input()))]) +    s += ["".join(sorted(eval(input())))]  # appendよりも'+='の方が高速！ +s = sorted(s)  # さらにソートして全検索を避ける -for i in range(1, n): +for i in range(1, n):  # 隣り合う要素が重複する数をリストに格納 -for j in a: +for j in a:  # 各重複する数から各組み合わせ数を返し合算