import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.util.Arrays;
import java.util.HashMap;
import java.util.StringTokenizer;

import java.io.BufferedReader;



public class Main{

    public static void main(String[] args) throws IOException {

        Scanner sc = new Scanner(System.in);
        PrintWriter out = new PrintWriter(System.out);

        HashMap<String,Integer> a = new HashMap<>();

        int n = sc.nextInt();
        long ans = 0;
        for (int i = 0; i < n; i++) {
            String[] s = sc.next().split("");
            Arrays.sort(s);
            String ss = "";
            for (int j = 0; j < s.length; j++) {
                ss += s[j];
            }
            if(a.containsKey(ss)){
                ans += a.get(ss);
                a.put(ss,a.get(ss)+1);
            }
            else {
                a.put(ss,1);
            }

        }
        out.print(ans);
        out.flush();

    }

}



class Scanner {
    StringTokenizer st;
    BufferedReader br;

    public Scanner(InputStream system) {
        br = new BufferedReader(new InputStreamReader(system));
    }

    public String next() throws IOException {
        while (st == null || !st.hasMoreTokens())
            st = new StringTokenizer(br.readLine());
        return st.nextToken();
    }

    public String nextLine() throws IOException {
        return br.readLine();
    }

    public int nextInt() throws IOException {
        return Integer.parseInt(next());
    }

    public double nextDouble() throws IOException {
        return Double.parseDouble(next());
    }

    public char nextChar() throws IOException {
        return next().charAt(0);
    }

    public Long nextLong() throws IOException {
        return Long.parseLong(next());
    }

    public boolean ready() throws IOException {
        return br.ready();
    }

    public void waitForInput() throws InterruptedException {
        Thread.sleep(3000);
    }


}
 import java.io.IOException; IOException java.io import java.io.InputStream; InputStream java.io import java.io.InputStreamReader; InputStreamReader java.io import java.io.PrintWriter; PrintWriter java.io import java.util.Arrays; Arrays java.util import java.util.HashMap; HashMap java.util import java.util.StringTokenizer; StringTokenizer java.util import java.io.BufferedReader; BufferedReader java.io public class Main{

    public static void main(String[] args) throws IOException {

        Scanner sc = new Scanner(System.in);
        PrintWriter out = new PrintWriter(System.out);

        HashMap<String,Integer> a = new HashMap<>();

        int n = sc.nextInt();
        long ans = 0;
        for (int i = 0; i < n; i++) {
            String[] s = sc.next().split("");
            Arrays.sort(s);
            String ss = "";
            for (int j = 0; j < s.length; j++) {
                ss += s[j];
            }
            if(a.containsKey(ss)){
                ans += a.get(ss);
                a.put(ss,a.get(ss)+1);
            }
            else {
                a.put(ss,1);
            }

        }
        out.print(ans);
        out.flush();

    }

} Main public static void main(String[] args) throws IOException {

        Scanner sc = new Scanner(System.in);
        PrintWriter out = new PrintWriter(System.out);

        HashMap<String,Integer> a = new HashMap<>();

        int n = sc.nextInt();
        long ans = 0;
        for (int i = 0; i < n; i++) {
            String[] s = sc.next().split("");
            Arrays.sort(s);
            String ss = "";
            for (int j = 0; j < s.length; j++) {
                ss += s[j];
            }
            if(a.containsKey(ss)){
                ans += a.get(ss);
                a.put(ss,a.get(ss)+1);
            }
            else {
                a.put(ss,1);
            }

        }
        out.print(ans);
        out.flush();

    } main {

        Scanner sc = new Scanner(System.in);
        PrintWriter out = new PrintWriter(System.out);

        HashMap<String,Integer> a = new HashMap<>();

        int n = sc.nextInt();
        long ans = 0;
        for (int i = 0; i < n; i++) {
            String[] s = sc.next().split("");
            Arrays.sort(s);
            String ss = "";
            for (int j = 0; j < s.length; j++) {
                ss += s[j];
            }
            if(a.containsKey(ss)){
                ans += a.get(ss);
                a.put(ss,a.get(ss)+1);
            }
            else {
                a.put(ss,1);
            }

        }
        out.print(ans);
        out.flush();

    } Scanner sc = new Scanner(System.in); sc new Scanner(System.in) PrintWriter out = new PrintWriter(System.out); out new PrintWriter(System.out) HashMap<String,Integer> a = new HashMap<>(); a new HashMap<>() int n = sc.nextInt(); n sc.nextInt() sc.nextInt sc long ans = 0; ans 0 for (int i = 0; i < n; i++) {
            String[] s = sc.next().split("");
            Arrays.sort(s);
            String ss = "";
            for (int j = 0; j < s.length; j++) {
                ss += s[j];
            }
            if(a.containsKey(ss)){
                ans += a.get(ss);
                a.put(ss,a.get(ss)+1);
            }
            else {
                a.put(ss,1);
            }

        } int i = 0; int i = 0; i 0 i < n i n i++ i++ i {
            String[] s = sc.next().split("");
            Arrays.sort(s);
            String ss = "";
            for (int j = 0; j < s.length; j++) {
                ss += s[j];
            }
            if(a.containsKey(ss)){
                ans += a.get(ss);
                a.put(ss,a.get(ss)+1);
            }
            else {
                a.put(ss,1);
            }

        } {
            String[] s = sc.next().split("");
            Arrays.sort(s);
            String ss = "";
            for (int j = 0; j < s.length; j++) {
                ss += s[j];
            }
            if(a.containsKey(ss)){
                ans += a.get(ss);
                a.put(ss,a.get(ss)+1);
            }
            else {
                a.put(ss,1);
            }

        } String[] s = sc.next().split(""); s sc.next().split("") sc.next().split sc.next() sc.next sc "" Arrays.sort(s) Arrays.sort Arrays s String ss = ""; ss "" for (int j = 0; j < s.length; j++) {
                ss += s[j];
            } int j = 0; int j = 0; j 0 j < s.length j s.length s s.length j++ j++ j {
                ss += s[j];
            } {
                ss += s[j];
            } ss += s[j] ss s[j] s j if(a.containsKey(ss)){
                ans += a.get(ss);
                a.put(ss,a.get(ss)+1);
            }
            else {
                a.put(ss,1);
            } a.containsKey(ss) a.containsKey a ss {
                ans += a.get(ss);
                a.put(ss,a.get(ss)+1);
            } ans += a.get(ss) ans a.get(ss) a.get a ss a.put(ss,a.get(ss)+1) a.put a ss a.get(ss)+1 a.get(ss) a.get a ss 1 {
                a.put(ss,1);
            } a.put(ss,1) a.put a ss 1 out.print(ans) out.print out ans out.flush() out.flush out String[] args args class Scanner {
    StringTokenizer st;
    BufferedReader br;

    public Scanner(InputStream system) {
        br = new BufferedReader(new InputStreamReader(system));
    }

    public String next() throws IOException {
        while (st == null || !st.hasMoreTokens())
            st = new StringTokenizer(br.readLine());
        return st.nextToken();
    }

    public String nextLine() throws IOException {
        return br.readLine();
    }

    public int nextInt() throws IOException {
        return Integer.parseInt(next());
    }

    public double nextDouble() throws IOException {
        return Double.parseDouble(next());
    }

    public char nextChar() throws IOException {
        return next().charAt(0);
    }

    public Long nextLong() throws IOException {
        return Long.parseLong(next());
    }

    public boolean ready() throws IOException {
        return br.ready();
    }

    public void waitForInput() throws InterruptedException {
        Thread.sleep(3000);
    }


} Scanner StringTokenizer st; st BufferedReader br; br public Scanner(InputStream system) {
        br = new BufferedReader(new InputStreamReader(system));
    } Scanner {
        br = new BufferedReader(new InputStreamReader(system));
    } br = new BufferedReader(new InputStreamReader(system)) br new BufferedReader(new InputStreamReader(system)) InputStream system system public String next() throws IOException {
        while (st == null || !st.hasMoreTokens())
            st = new StringTokenizer(br.readLine());
        return st.nextToken();
    } next {
        while (st == null || !st.hasMoreTokens())
            st = new StringTokenizer(br.readLine());
        return st.nextToken();
    } while (st == null || !st.hasMoreTokens())
            st = new StringTokenizer(br.readLine()); st == null || !st.hasMoreTokens() st == null st null !st.hasMoreTokens() st.hasMoreTokens() st.hasMoreTokens st st = new StringTokenizer(br.readLine()) st new StringTokenizer(br.readLine()) return st.nextToken(); st.nextToken() st.nextToken st public String nextLine() throws IOException {
        return br.readLine();
    } nextLine {
        return br.readLine();
    } return br.readLine(); br.readLine() br.readLine br public int nextInt() throws IOException {
        return Integer.parseInt(next());
    } nextInt {
        return Integer.parseInt(next());
    } return Integer.parseInt(next()); Integer.parseInt(next()) Integer.parseInt Integer next() next public double nextDouble() throws IOException {
        return Double.parseDouble(next());
    } nextDouble {
        return Double.parseDouble(next());
    } return Double.parseDouble(next()); Double.parseDouble(next()) Double.parseDouble Double next() next public char nextChar() throws IOException {
        return next().charAt(0);
    } nextChar {
        return next().charAt(0);
    } return next().charAt(0); next().charAt(0) next().charAt next() next 0 public Long nextLong() throws IOException {
        return Long.parseLong(next());
    } nextLong {
        return Long.parseLong(next());
    } return Long.parseLong(next()); Long.parseLong(next()) Long.parseLong Long next() next public boolean ready() throws IOException {
        return br.ready();
    } ready {
        return br.ready();
    } return br.ready(); br.ready() br.ready br public void waitForInput() throws InterruptedException {
        Thread.sleep(3000);
    } waitForInput {
        Thread.sleep(3000);
    } Thread.sleep(3000) Thread.sleep Thread 3000 public class Main{

    public static void main(String[] args) throws IOException {

        Scanner sc = new Scanner(System.in);
        PrintWriter out = new PrintWriter(System.out);

        HashMap<String,Integer> a = new HashMap<>();

        int n = sc.nextInt();
        long ans = 0;
        for (int i = 0; i < n; i++) {
            String[] s = sc.next().split("");
            Arrays.sort(s);
            String ss = "";
            for (int j = 0; j < s.length; j++) {
                ss += s[j];
            }
            if(a.containsKey(ss)){
                ans += a.get(ss);
                a.put(ss,a.get(ss)+1);
            }
            else {
                a.put(ss,1);
            }

        }
        out.print(ans);
        out.flush();

    }

} public class Main{

    public static void main(String[] args) throws IOException {

        Scanner sc = new Scanner(System.in);
        PrintWriter out = new PrintWriter(System.out);

        HashMap<String,Integer> a = new HashMap<>();

        int n = sc.nextInt();
        long ans = 0;
        for (int i = 0; i < n; i++) {
            String[] s = sc.next().split("");
            Arrays.sort(s);
            String ss = "";
            for (int j = 0; j < s.length; j++) {
                ss += s[j];
            }
            if(a.containsKey(ss)){
                ans += a.get(ss);
                a.put(ss,a.get(ss)+1);
            }
            else {
                a.put(ss,1);
            }

        }
        out.print(ans);
        out.flush();

    }

} Main
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.util.Arrays;
import java.util.HashMap;
import java.util.StringTokenizer;

import java.io.BufferedReader;



public class Main{

    public static void main(String[] args) throws IOException {

        Scanner sc = new Scanner(System.in);
        PrintWriter out = new PrintWriter(System.out);

        HashMap<String,Integer> a = new HashMap<>();

        int n = sc.nextInt();
        long ans = 0;
        for (int i = 0; i < n; i++) {
            String[] s = sc.next().split("");
            Arrays.sort(s);
            String ss = "";
            for (int j = 0; j < s.length; j++) {
                ss += s[j];
            }
            if(a.containsKey(ss)){
                ans += a.get(ss);
                a.put(ss,a.get(ss)+1);
            }
            else {
                a.put(ss,1);
            }

        }
        out.print(ans);
        out.flush();

    }

}



class Scanner {
    StringTokenizer st;
    BufferedReader br;

    public Scanner(InputStream system) {
        br = new BufferedReader(new InputStreamReader(system));
    }

    public String next() throws IOException {
        while (st == null || !st.hasMoreTokens())
            st = new StringTokenizer(br.readLine());
        return st.nextToken();
    }

    public String nextLine() throws IOException {
        return br.readLine();
    }

    public int nextInt() throws IOException {
        return Integer.parseInt(next());
    }

    public double nextDouble() throws IOException {
        return Double.parseDouble(next());
    }

    public char nextChar() throws IOException {
        return next().charAt(0);
    }

    public Long nextLong() throws IOException {
        return Long.parseLong(next());
    }

    public boolean ready() throws IOException {
        return br.ready();
    }

    public void waitForInput() throws InterruptedException {
        Thread.sleep(3000);
    }


}

