// Original C++ solution (slower):
#include <stdio.h>

#include <stdlib.h>

#include <assert.h>

#include <fstream>

#include <iostream>

#include <sstream>

#include <iomanip>

#include <algorithm>

#include <bitset>

#include <array>

#include <vector>

#include <queue>

#include <set>

#include <cmath> // 変数名にy1が使えなくなるかも…。

#include <map>

#include <unordered_map>

#include <unordered_set>

#include <limits>

#include <functional>

#include <string>



typedef __int128_t int128_t;

std::istream &operator>>(std::istream& input, int128_t& value) { // int128_tの入力。入力が64bitに収まる前提。

    long long tmp; input >> tmp; value = tmp;

    return input;

}

std::ostream &operator<<(std::ostream& output, const int128_t value) { // int128_tの出力。出力が64bitに収まる前提。

    output << (long long)value;

    return output;

}



// 文字列Sに各文字が何回出現するかカウント。始まりの文字がcで、文字種類数がk

// 例えばSに含まれる文字が'a-z'であれば、c='a', k=26とする。

std::vector<int> count_char(const std::string& S, const char c, const int k) {

    std::vector<int> ret; ret.resize(k, 0);

    for (int i = 0; i < S.size(); i++) {

        assert(S[i] - c < k);

        ret[S[i] - c]++;

    }

    return ret;

}



#define rep(i, begin, end) for(int64_t i = (begin); i <= (end); i++)

#define rev(i, begin, end) for(int64_t i = (begin); (end) <= i; i--)



void printvec(const std::vector<int>& vec) {

    for (int i = 0; i < vec.size(); i++) { std::cout << vec[i] << " "; } std::cout << std::endl;

}



const int MAX_N = 1e5 + 10;

int N;

std::string S[MAX_N];

std::map<std::string, int128_t> mp;





int main(int argc, char **argv) {

    std::cin >> N;

    rep (i, 1, N) {

        std::cin >> S[i];

        std::sort(S[i].begin(), S[i].end());

        mp[S[i]]++;

    }



    int128_t ret = 0;

    for (auto p : mp) {

        ret += (p.second * (p.second - 1)) / 2;

    }



    std::cout << ret << std::endl;



    



    return 0;

}

// Optimized solution to the same problem (faster):
#include <stdio.h>

#include <stdlib.h>

#include <assert.h>

#include <fstream>

#include <iostream>

#include <sstream>

#include <iomanip>

#include <algorithm>

#include <bitset>

#include <array>

#include <vector>

#include <queue>

#include <set>

#include <cmath> // 変数名にy1が使えなくなるかも…。

#include <map>

#include <unordered_map>

#include <unordered_set>

#include <limits>

#include <functional>

#include <string>



typedef __int128_t int128_t;

std::istream &operator>>(std::istream& input, int128_t& value) { // int128_tの入力。入力が64bitに収まる前提。

    long long tmp; input >> tmp; value = tmp;

    return input;

}

std::ostream &operator<<(std::ostream& output, const int128_t value) { // int128_tの出力。出力が64bitに収まる前提。

    output << (long long)value;

    return output;

}



// 文字列Sに各文字が何回出現するかカウント。始まりの文字がcで、文字種類数がk

// 例えばSに含まれる文字が'a-z'であれば、c='a', k=26とする。

std::vector<int> count_char(const std::string& S, const char c, const int k) {

    std::vector<int> ret; ret.resize(k, 0);

    for (int i = 0; i < S.size(); i++) {

        assert(S[i] - c < k);

        ret[S[i] - c]++;

    }

    return ret;

}



#define rep(i, begin, end) for(int64_t i = (begin); i <= (end); i++)

#define rev(i, begin, end) for(int64_t i = (begin); (end) <= i; i--)



#define input1(begin, end, v1) v1.resize((end)+1); for (int i = (begin); i <= (end); i++) { std::cin >> v1[i]; } 

#define input3(begin, end, v1, v2, v3) v1.resize((end)+1); v2.resize((end)+1); v3.resize((end)+1); for (int i = (begin); i <= (end); i++) { std::cin >> v1[i] >> v2[i] >> v3[i]; } 



void printvec(const std::vector<int>& vec) {

    for (int i = 0; i < vec.size(); i++) { std::cout << vec[i] << " "; } std::cout << std::endl;

}



int N;

std::vector<std::string> S;

std::map<std::string, int128_t> mp;





int main(int argc, char **argv) {

    std::cin >> N;



    input1(1, N, S);



    rep (i, 1, N) {

        std::sort(S[i].begin(), S[i].end());

        mp[S[i]]++;

    }



    int128_t ret = 0;

    for (auto p : mp) {

        ret += (p.second * (p.second - 1)) / 2;

    }



    std::cout << ret << std::endl;



    



    return 0;

}

// Fastest known solution for this problem: