using System;
using System.Collections;
using System.Collections.Generic;
using static System.Console;
using static System.Math;
 
public class Hello{
    public static void Main(){
        int num = rint();
        // hash = dictionary(?)
        var hash = new Dictionary<string,int>();
        long total = 0;
        for(int i=0;i<num;i++){
            string read = rstr();
            
            //-------------------------------------------
            /*
            char[] chan = new char[10];
            for(int j=0;j<10;j++){
                chan[j] = read[j];
            }
            */
            //-------------------------------------------
            char[] chan = read.ToCharArray();
            
            Array.Sort(chan);
            
            //-------------------------------------------
            /*
            string change = "";
            for(int j=0;j<10;j++){
                change += chan[j];
            }
            */
            //-------------------------------------------
            string change = new string(chan);
            
            // hoge.ContainsKey(string) => return boolean
            // hoge[string] => return int
            // hoge[int] => CE
            // hoge<int1,int2>: hoge[int1] => return int2
            if(hash.ContainsKey(change)){
                total += hash[change];
                hash[change]++;
            }else{
                // hoge.Add(string,int)
                hash.Add(change,1);
            }
        }
        WriteLine(total);
        /*
        var hoge = new Dictionary<int,int>();
        hoge.Add(1,8);
        WriteLine(hoge[1]);
        */
    
    
    
    
    }
    // Dictionary hoge<string,int>
        // hoge.ContainsKey(string) => return boolean
        // hoge[string] => return int
        // hoge[int] => CE
    // Dictionary hoge<int1,int2>
        // hoge<int1,int2>: hoge[int1] => return int2
    //各種読取
    static string rstr(){
        return ReadLine();
    }
    static int rint(){
        return int.Parse(ReadLine());
    }
    static long rlong(){
        return long.Parse(ReadLine());
    }
    static string[] stra(){
        return ReadLine().Split(' ');
    }
    static int[] inta(){
        string[] read_str_array = ReadLine().Split(' ');
        int[] return_int_array = new int[read_str_array.Length];
        for(int countup_i=0;countup_i<read_str_array.Length;countup_i++){
            return_int_array[countup_i] = int.Parse(read_str_array[countup_i]);
        }
        return return_int_array;
    }
    static int[,] inta2(int num_array,int in_array){
        int[,] int_array2 = new int[num_array,in_array];
        for(int i=0;i<num_array;i++){
            int[] temp_array = inta();
            for(int j=0;j<in_array;j++){
                int_array2[i,j] = temp_array[j];
            }
        }
        return int_array2;
    }
    static long[] longa(){
        string[] read_str_array = ReadLine().Split(' ');
        long[] return_long_array = new long[read_str_array.Length];
        for(long countup_i=0;countup_i<read_str_array.Length;countup_i++){
            return_long_array[countup_i] = long.Parse(read_str_array[countup_i]);
        }
        return return_long_array;
    }
    static double[] doublea(){
        string[] read_str_array = ReadLine().Split(' ');
        double[] return_double_array = new double[read_str_array.Length];
        for(long countup_i=0;countup_i<read_str_array.Length;countup_i++){
            return_double_array[countup_i] = long.Parse(read_str_array[countup_i]);
        }
        return return_double_array;
    }
    // A/B小数点以下切上
    static int divideup(int divided,int divid){
        int temp_divide = divided/divid;
        if(divided % divid > 0){
            temp_divide++;
        }
        return temp_divide;
    }
}


Measured memory_bytes: 28120