In Aramic language words can only represent objects.

Words in Aramic have special properties: 

  * A word is a root if it does not contain the same letter more than once. 
  * A root and all its permutations represent the same object. 
  * The root x of a word y is the word that contains all letters that appear in y in a way that each letter appears once. For example, the root of "aaaa", "aa", "aaa" is "a", the root of "aabb", "bab", "baabb", "ab" is "ab". 
  * Any word in Aramic represents the same object as its root. 



You have an ancient script in Aramic. What is the number of different objects mentioned in the script?

Input

The first line contains one integer n (1 ≤ n ≤ 10^3) — the number of words in the script.

The second line contains n words s_1, s_2, …, s_n — the script itself. The length of each string does not exceed 10^3.

It is guaranteed that all characters of the strings are small latin letters.

Output

Output one integer — the number of different objects mentioned in the given ancient Aramic script.

Examples

Input

5
a aa aaa ab abb


Output

2

Input

3
amer arem mrea


Output

1

Note

In the first test, there are two objects mentioned. The roots that represent them are "a","ab".

In the second test, there is only one object, its root is "amer", the other strings are just permutations of "amer".
import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;
import java.io.IOException;import java.io.PrintStream;import java.io.PrintWriter;
import java.security.AccessControlException;import java.util.Arrays;import java.util.Collection;
import java.util.Comparator;import java.util.List;import java.util.Map;import java.util.Objects;
import java.util.Scanner;import java.util.TreeMap;import java.util.TreeSet;import java.util.function.Function;
import java.util.stream.Collectors;import java.util.stream.IntStream;import java.util.stream.LongStream;
import java.util.stream.Stream;public class _p000975A {static public void main(final String[] args) 
throws IOException{p000975A._main(args);}
static private class p000975A extends Solver{public p000975A(){nameIn="in/900/p000975A.in"
;singleTest=true;}@Override public void solve()throws IOException{int n=sc.nextInt
();if(sc.hasNextLine()){sc.nextLine();}String[]s=lineToArray();TreeSet<String>set
=new TreeSet<>();for(String t:s){Map<String,List<Integer>>mapi=mapi(t.chars().mapToObj
(c->String.valueOf(c)));set.add(join(mapi.keySet().stream().sorted()));}pw.println
(set.size());}static public void _main(String[]args)throws IOException{new p000975A
().run();}}static private class Pair<K,V>{private K k;private V v;public Pair(final
 K t,final V u){this.k=t;this.v=u;}public K getKey(){return k;}public V getValue
(){return v;}}static private abstract class Solver{protected String nameIn=null;
protected String nameOut=null;protected boolean singleTest=false;protected boolean
 preprocessDebug=false;protected boolean doNotPreprocess=false;protected PrintStream
 debugPrintStream=null;protected Scanner sc=null;protected PrintWriter pw=null;final
 static String SPACE=" ";final static String SPACES="\\s+";private void process(
)throws IOException{if(!singleTest){int t=lineToIntArray()[0];while(t-->0){solve
();}}else{solve();}}abstract protected void solve()throws IOException;protected 
String[]lineToArray()throws IOException{return sc.nextLine().trim().split(SPACES
);}protected int[]lineToIntArray()throws IOException{return Arrays.stream(lineToArray
()).mapToInt(Integer::valueOf).toArray();}protected long[]lineToLongArray()throws
 IOException{return Arrays.stream(lineToArray()).mapToLong(Long::valueOf).toArray
();}protected void run()throws IOException{boolean done=false;try{if(nameIn!=null
 && new File(nameIn).exists()){try(FileInputStream fis=new FileInputStream(nameIn
);PrintWriter pw0=select_output();){done=true;sc=new Scanner(fis);pw=pw0;process
();}}}catch(IOException ex){}catch(AccessControlException ex){}if(!done){try(PrintWriter
 pw0=select_output();){sc=new Scanner(System.in);pw=pw0;process();}}}private PrintWriter
 select_output()throws FileNotFoundException{if(nameOut!=null){return new PrintWriter
(nameOut);}return new PrintWriter(System.out);}public static Map<Integer,List<Integer
>>mapi(final int[]a){return IntStream.range(0,a.length).collect(()->new TreeMap<
Integer,List<Integer>>(),(res,i)->{if(!res.containsKey(a[i])){res.put(a[i],Stream
.of(i).collect(Collectors.toList()));}else{res.get(a[i]).add(i);}},Map::putAll);
}public static Map<Long,List<Integer>>mapi(final long[]a){return IntStream.range
(0,a.length).collect(()->new TreeMap<Long,List<Integer>>(),(res,i)->{if(!res.containsKey
(a[i])){res.put(a[i],Stream.of(i).collect(Collectors.toList()));}else{res.get(a[
i]).add(i);}},Map::putAll);}public static<T>Map<T,List<Integer>>mapi(final T[]a)
{return IntStream.range(0,a.length).collect(()->new TreeMap<T,List<Integer>>(),(
res,i)->{if(!res.containsKey(a[i])){res.put(a[i],Stream.of(i).collect(Collectors
.toList()));}else{res.get(a[i]).add(i);}},Map::putAll);}public static<T>Map<T,List
<Integer>>mapi(final T[]a,Comparator<T>cmp){return IntStream.range(0,a.length).collect
(()->new TreeMap<T,List<Integer>>(cmp),(res,i)->{if(!res.containsKey(a[i])){res.
put(a[i],Stream.of(i).collect(Collectors.toList()));}else{res.get(a[i]).add(i);}
},Map::putAll);}public static Map<Integer,List<Integer>>mapi(final IntStream a){
int[]i=new int[]{0};return a.collect(()->new TreeMap<Integer,List<Integer>>(),(res
,v)->{if(!res.containsKey(v)){res.put(v,Stream.of(i[0]).collect(Collectors.toList
()));}else{res.get(v).add(i[0]);}i[0]++;},Map::putAll);}public static Map<Long,List
<Integer>>mapi(final LongStream a){int[]i=new int[]{0};return a.collect(()->new 
TreeMap<Long,List<Integer>>(),(res,v)->{if(!res.containsKey(v)){res.put(v,Stream
.of(i[0]).collect(Collectors.toList()));}else{res.get(v).add(i[0]);}i[0]++;},Map
::putAll);}public static<T>Map<T,List<Integer>>mapi(final Stream<T>a,Comparator<
T>cmp){int[]i=new int[]{0};return a.collect(()->new TreeMap<T,List<Integer>>(cmp
),(res,v)->{if(!res.containsKey(v)){res.put(v,Stream.of(i[0]).collect(Collectors
.toList()));}else{res.get(v).add(i[0]);}},Map::putAll);}public static<T>Map<T,List
<Integer>>mapi(final Stream<T>a){int[]i=new int[]{0};return a.collect(()->new TreeMap
<T,List<Integer>>(),(res,v)->{if(!res.containsKey(v)){res.put(v,Stream.of(i[0]).
collect(Collectors.toList()));}else{res.get(v).add(i[0]);}},Map::putAll);}public
 static List<int[]>listi(final int[]a){return IntStream.range(0,a.length).mapToObj
(i->new int[]{a[i],i}).collect(Collectors.toList());}public static List<long[]>listi
(final long[]a){return IntStream.range(0,a.length).mapToObj(i->new long[]{a[i],i
}).collect(Collectors.toList());}public static<T>List<Pair<T,Integer>>listi(final
 T[]a){return IntStream.range(0,a.length).mapToObj(i->new Pair<T,Integer>(a[i],i
)).collect(Collectors.toList());}public static List<int[]>listi(final IntStream 
a){int[]i=new int[]{0};return a.mapToObj(v->new int[]{v,i[0]++}).collect(Collectors
.toList());}public static List<long[]>listi(final LongStream a){int[]i=new int[]
{0};return a.mapToObj(v->new long[]{v,i[0]++}).collect(Collectors.toList());}public
 static<T>List<Pair<T,Integer>>listi(final Stream<T>a){int[]i=new int[]{0};return
 a.map(v->new Pair<T,Integer>(v,i[0]++)).collect(Collectors.toList());}public static
 String join(final int[]a){return Arrays.stream(a).mapToObj(Integer::toString).collect
(Collectors.joining(SPACE));}public static String join(final long[]a){return Arrays
.stream(a).mapToObj(Long::toString).collect(Collectors.joining(SPACE));}public static
<T>String join(final T[]a){return Arrays.stream(a).map(v->Objects.toString(v)).collect
(Collectors.joining(SPACE));}public static<T>String join(final T[]a,final Function
<T,String>toString){return Arrays.stream(a).map(v->toString.apply(v)).collect(Collectors
.joining(SPACE));}public static<T>String join(final Collection<T>a){return a.stream
().map(v->Objects.toString(v)).collect(Collectors.joining(SPACE));}public static
<T>String join(final Collection<T>a,final Function<T,String>toString){return a.stream
().map(v->toString.apply(v)).collect(Collectors.joining(SPACE));}public static<T
>String join(final Stream<T>a){return a.map(v->Objects.toString(v)).collect(Collectors
.joining(SPACE));}public static<T>String join(final Stream<T>a,final Function<T,
String>toString){return a.map(v->toString.apply(v)).collect(Collectors.joining(SPACE
));}public static<T>String join(final IntStream a){return a.mapToObj(Integer::toString
).collect(Collectors.joining(SPACE));}public static<T>String join(final LongStream
 a){return a.mapToObj(Long::toString).collect(Collectors.joining(SPACE));}public
 static List<Integer>list(final int[]a){return Arrays.stream(a).mapToObj(Integer
::valueOf).collect(Collectors.toList());}public static List<Integer>list(final IntStream
 a){return a.mapToObj(Integer::valueOf).collect(Collectors.toList());}public static
 List<Long>list(final long[]a){return Arrays.stream(a).mapToObj(Long::valueOf).collect
(Collectors.toList());}public static List<Long>list(final LongStream a){return a
.mapToObj(Long::valueOf).collect(Collectors.toList());}public static<T>List<T>list
(final Stream<T>a){return a.collect(Collectors.toList());}public static<T>List<T
>list(final T[]a){return Arrays.stream(a).collect(Collectors.toList());}}}
