import java.io.*;
import java.math.BigInteger;
import java.util.*;

public class E implements Runnable {
	public static void main (String[] args) {new Thread(null, new E(), "_cf", 1 << 28).start();}

	int n, m;
	char[] str;
	int[][] occs, cost;
	int[] dp;

	public void run() {
		FastScanner fs = new FastScanner();
		PrintWriter out = new PrintWriter(System.out);
		System.err.println("");

		//where's my 420???? :(
		long tot = 0;
		for(int i = 0; i < 19000; i++) tot += i;
		System.err.println(tot);

		n = fs.nextInt(); m = fs.nextInt();
		byte[] str = fs.next().getBytes();
		int[] occs = new int[1<<m];
		for(int i = 0; i < n-1; i++) {
			int l1 = str[i] - 'a';
			int l2 = str[i+1] - 'a';
			occs[(1<<l1) | (1<<l2)]++;
			occs[(1<<l2) | (1<<l1)]++;
		}
		//cost[mask][v] = numPairs with v for some all bits on in mask
		int all = (1<<m)-1;
		cost = new int[m][1<<m];
		for(int i = 0; i < m; i++) {
			for(int mask = 1; mask < all; mask++) {
				if(((1<<i)&mask) > 0) continue;
				int lb = mask & (-mask);
				int trail = Integer.numberOfTrailingZeros(lb);
				int nmask = mask ^ lb;
				cost[i][mask] = cost[i][nmask]+occs[1<<i | 1<<trail];
			}
		}

		dp = new int[1<<m];
		for(int mask = dp.length-2; mask >= 0; mask--) {
			int addOn = 0;
			for(int nxt = 0; nxt < m; nxt++) {
				if(((1<<nxt)&mask) > 0) continue;
				addOn += cost[nxt][mask];
			}
			int res = oo;
			for(int nxt = 0; nxt < m; nxt++) {
				if(((1<<nxt)&mask) > 0) continue;
				int ret = addOn+dp[mask | (1<<nxt)];
				res = min(res, ret);
			}
			dp[mask] = res;
		}

		System.out.println(dp[0]>>1);

		out.close();
	}

	int oo = (int)1e9;
	int min(int a, int b) {
		if(a < b) return a;
		return b;
	}

	class FastScanner {
		public int BS = 1<<16;
		public char NC = (char)0;
		byte[] buf = new byte[BS];
		int bId = 0, size = 0;
		char c = NC;
		double num = 1;
		BufferedInputStream in;

		public FastScanner() {
			in = new BufferedInputStream(System.in, BS);
		}

		public FastScanner(String s) {
			try {
				in = new BufferedInputStream(new FileInputStream(new File(s)), BS);
			}
			catch (Exception e) {
				in = new BufferedInputStream(System.in, BS);
			}
		}

		public char nextChar(){
			while(bId==size) {
				try {
					size = in.read(buf);
				}catch(Exception e) {
					return NC;
				}
				if(size==-1)return NC;
				bId=0;
			}
			return (char)buf[bId++];
		}

		public int nextInt() {
			return (int)nextLong();
		}

		public long nextLong() {
			num=1;
			boolean neg = false;
			if(c==NC)c=nextChar();
			for(;(c<'0' || c>'9'); c = nextChar()) {
				if(c=='-')neg=true;
			}
			long res = 0;
			for(; c>='0' && c <='9'; c=nextChar()) {
				res = (res<<3)+(res<<1)+c-'0';
				num*=10;
			}
			return neg?-res:res;
		}

		public double nextDouble() {
			double cur = nextLong();
			return c!='.' ? cur:cur+nextLong()/num;
		}

		public String next() {
			StringBuilder res = new StringBuilder();
			while(c<=32)c=nextChar();
			while(c>32) {
				res.append(c);
				c=nextChar();
			}
			return res.toString();
		}

		public String nextLine() {
			StringBuilder res = new StringBuilder();
			while(c<=32)c=nextChar();
			while(c!='\n') {
				res.append(c);
				c=nextChar();
			}
			return res.toString();
		}

		public boolean hasNext() {
			if(c>32)return true;
			while(true) {
				c=nextChar();
				if(c==NC)return false;
				else if(c>32)return true;
			}
		}

		public int[] nextIntArray(int n) {
			int[] res = new int[n];
			for(int i = 0; i < n; i++) res[i] = nextInt();
			return res;
		}

	}

}


import java.io.*;
import java.math.BigInteger;
import java.util.*;

public class E implements Runnable {
	public static void main (String[] args) {new Thread(null, new E(), "_cf", 1 << 28).start();}

	int n, m;
	char[] str;
	int[][] occs, cost;
	int[] dp;

	public void run() {
		FastScanner fs = new FastScanner();
		PrintWriter out = new PrintWriter(System.out);
		System.err.println("");

		//where's my 420??? :(

		n = fs.nextInt(); m = fs.nextInt();
		byte[] str = fs.next().getBytes();
		int[] occs = new int[1<<m];
		for(int i = 0; i < n-1; i++) {
			int l1 = str[i] - 'a';
			int l2 = str[i+1] - 'a';
			occs[(1<<l1) | (1<<l2)]++;
			occs[(1<<l2) | (1<<l1)]++;
		}
		//cost[mask][v] = numPairs with v for some all bits on in mask
		int all = (1<<m)-1;
		cost = new int[m][1<<m];
		for(int i = 0; i < m; i++) {
			for(int mask = 1; mask < all; mask++) {
				if(((1<<i)&mask) > 0) continue;
				int lb = mask & (-mask);
				int trail = Integer.numberOfTrailingZeros(lb);
				int nmask = mask ^ lb;
				cost[i][mask] = cost[i][nmask]+occs[1<<i | 1<<trail];
			}
		}

		dp = new int[1<<m];
		for(int mask = dp.length-2; mask >= 0; mask--) {
			int addOn = 0;
			for(int nxt = 0; nxt < m; nxt++) {
				if(((1<<nxt)&mask) > 0) continue;
				addOn += cost[nxt][mask];
			}
			int res = oo;
			for(int nxt = 0; nxt < m; nxt++) {
				if(((1<<nxt)&mask) > 0) continue;
				int ret = addOn+dp[mask | (1<<nxt)];
				res = min(res, ret);
			}
			dp[mask] = res;
		}

		System.out.println(dp[0]>>1);

		out.close();
	}

	int oo = (int)1e9;
	int min(int a, int b) {
		if(a < b) return a;
		return b;
	}

	class FastScanner {
		public int BS = 1<<16;
		public char NC = (char)0;
		byte[] buf = new byte[BS];
		int bId = 0, size = 0;
		char c = NC;
		double num = 1;
		BufferedInputStream in;

		public FastScanner() {
			in = new BufferedInputStream(System.in, BS);
		}

		public FastScanner(String s) {
			try {
				in = new BufferedInputStream(new FileInputStream(new File(s)), BS);
			}
			catch (Exception e) {
				in = new BufferedInputStream(System.in, BS);
			}
		}

		public char nextChar(){
			while(bId==size) {
				try {
					size = in.read(buf);
				}catch(Exception e) {
					return NC;
				}
				if(size==-1)return NC;
				bId=0;
			}
			return (char)buf[bId++];
		}

		public int nextInt() {
			return (int)nextLong();
		}

		public long nextLong() {
			num=1;
			boolean neg = false;
			if(c==NC)c=nextChar();
			for(;(c<'0' || c>'9'); c = nextChar()) {
				if(c=='-')neg=true;
			}
			long res = 0;
			for(; c>='0' && c <='9'; c=nextChar()) {
				res = (res<<3)+(res<<1)+c-'0';
				num*=10;
			}
			return neg?-res:res;
		}

		public double nextDouble() {
			double cur = nextLong();
			return c!='.' ? cur:cur+nextLong()/num;
		}

		public String next() {
			StringBuilder res = new StringBuilder();
			while(c<=32)c=nextChar();
			while(c>32) {
				res.append(c);
				c=nextChar();
			}
			return res.toString();
		}

		public String nextLine() {
			StringBuilder res = new StringBuilder();
			while(c<=32)c=nextChar();
			while(c!='\n') {
				res.append(c);
				c=nextChar();
			}
			return res.toString();
		}

		public boolean hasNext() {
			if(c>32)return true;
			while(true) {
				c=nextChar();
				if(c==NC)return false;
				else if(c>32)return true;
			}
		}

		public int[] nextIntArray(int n) {
			int[] res = new int[n];
			for(int i = 0; i < n; i++) res[i] = nextInt();
			return res;
		}

	}

}


import java.io.*;
import java.math.BigInteger;
import java.util.*;

public class E implements Runnable {
	public static void main (String[] args) {new Thread(null, new E(), "_cf", 1 << 28).start();}

	int n, m;
	char[] str;
	int[][] occs, cost;
	int[] dp;

	public void run() {
		FastScanner fs = new FastScanner();
		PrintWriter out = new PrintWriter(System.out);
		System.err.println("");

		n = fs.nextInt(); m = fs.nextInt();
		str = fs.next().toCharArray();
		occs = new int[m][m];
		for(int i = 0; i < n-1; i++) {
			occs[str[i]-'a'][str[i+1]-'a']++;
			occs[str[i+1]-'a'][str[i]-'a']++;
		}
		//cost[mask][v] = numPairs with v for some all bits on in mask
		int all = (1<<m)-1;
		cost = new int[m][1<<m];
		for(int i = 0; i < m; i++) {
			for(int mask = 1; mask < all; mask++) {
				if(((1<<i)&mask) > 0) continue;
				int lb = mask & (-mask);
				int trail = Integer.numberOfTrailingZeros(lb);
				int nmask = mask ^ lb;
				cost[i][mask] = cost[i][nmask]+occs[i][trail];
			}
		}

		dp = new int[1<<m];
		Arrays.fill(dp, -1);
		System.out.println(solve(0));

		out.close();
	}

	int oo = (int)1e9;
	int solve(int mask) {
		if(mask == (1<<m)-1) return 0;
		if(dp[mask] != -1) return dp[mask];
		int res = oo;

		int addOn = 0;
		for(int nxt = 0; nxt < m; nxt++) {
			if(((1<<nxt)&mask) > 0) continue;
			addOn += cost[nxt][mask];
		}
		for(int nxt = 0; nxt < m; nxt++) {
			if(((1<<nxt)&mask) > 0) continue;
			int ret = addOn+solve(mask | (1<<nxt));
			res = Math.min(res, ret);
		}

		return dp[mask] = res;
	}

	class FastScanner {
		public int BS = 1<<16;
		public char NC = (char)0;
		byte[] buf = new byte[BS];
		int bId = 0, size = 0;
		char c = NC;
		double num = 1;
		BufferedInputStream in;

		public FastScanner() {
			in = new BufferedInputStream(System.in, BS);
		}

		public FastScanner(String s) {
			try {
				in = new BufferedInputStream(new FileInputStream(new File(s)), BS);
			}
			catch (Exception e) {
				in = new BufferedInputStream(System.in, BS);
			}
		}

		public char nextChar(){
			while(bId==size) {
				try {
					size = in.read(buf);
				}catch(Exception e) {
					return NC;
				}
				if(size==-1)return NC;
				bId=0;
			}
			return (char)buf[bId++];
		}

		public int nextInt() {
			return (int)nextLong();
		}

		public long nextLong() {
			num=1;
			boolean neg = false;
			if(c==NC)c=nextChar();
			for(;(c<'0' || c>'9'); c = nextChar()) {
				if(c=='-')neg=true;
			}
			long res = 0;
			for(; c>='0' && c <='9'; c=nextChar()) {
				res = (res<<3)+(res<<1)+c-'0';
				num*=10;
			}
			return neg?-res:res;
		}

		public double nextDouble() {
			double cur = nextLong();
			return c!='.' ? cur:cur+nextLong()/num;
		}

		public String next() {
			StringBuilder res = new StringBuilder();
			while(c<=32)c=nextChar();
			while(c>32) {
				res.append(c);
				c=nextChar();
			}
			return res.toString();
		}

		public String nextLine() {
			StringBuilder res = new StringBuilder();
			while(c<=32)c=nextChar();
			while(c!='\n') {
				res.append(c);
				c=nextChar();
			}
			return res.toString();
		}

		public boolean hasNext() {
			if(c>32)return true;
			while(true) {
				c=nextChar();
				if(c==NC)return false;
				else if(c>32)return true;
			}
		}

		public int[] nextIntArray(int n) {
			int[] res = new int[n];
			for(int i = 0; i < n; i++) res[i] = nextInt();
			return res;
		}

	}

}


/*
If you want to aim high, aim high
Don't let that studying and grades consume you
Just live life young
******************************
If I'm the sun, you're the moon
Because when I go up, you go down
*******************************
I'm working for the day I will surpass you
https://www.a2oj.com/Ladder16.html
*/
import java.util.*;
import java.io.*;
import java.math.*;

   public class x1238E
   {
      public static void main(String omkar[]) throws Exception
      {
         BufferedReader infile = new BufferedReader(new InputStreamReader(System.in));
         StringTokenizer st = new StringTokenizer(infile.readLine());
         int N = Integer.parseInt(st.nextToken());
         int M = Integer.parseInt(st.nextToken());
         String input = infile.readLine();
         int[][] cnt = new int[M][M];
         for(int i=0; i < N-1; i++)
         if(input.charAt(i) != input.charAt(i+1))
            {
               cnt[input.charAt(i)-'a'][input.charAt(i+1)-'a']++;
               cnt[input.charAt(i+1)-'a'][input.charAt(i)-'a']++;
            }
         long[] dp = new long[1 << M];
         Arrays.fill(dp, Long.MAX_VALUE);
         dp[0] = 0L;
         for(int mask=0; mask < dp.length; mask++)
            for(int b=0; b < M; b++)
               if((mask&(1<<b)) == 0)
               {
                  int submask = mask|(1<<b);
                  long cost = 0L;
                  for(int c=0; c < M; c++)
                  {
                     if((mask&(1<<c)) > 0)
                        cost += cnt[b][c];
                     else
                        cost -= cnt[b][c];
                  }
                  dp[submask] = Math.min(dp[submask], dp[mask]+cost*Integer.bitCount(mask));
               }
         System.out.println(dp[(1<<M)-1]);
      }
   }


/*
If you want to aim high, aim high
Don't let that studying and grades consume you
Just live life young
******************************
If I'm the sun, you're the moon
Because when I go up, you go down
*******************************
I'm working for the day I will surpass you
https://www.a2oj.com/Ladder16.html
*/
import java.util.*;
import java.io.*;
import java.math.*;

   public class x1238E
   {
      public static void main(String omkar[]) throws Exception
      {
         BufferedReader infile = new BufferedReader(new InputStreamReader(System.in));
         StringTokenizer st = new StringTokenizer(infile.readLine());
         int N = Integer.parseInt(st.nextToken());
         int M = Integer.parseInt(st.nextToken());
         String input = infile.readLine();
         int[][] cnt = new int[M][M];
         for(int i=0; i < N-1; i++)
         if(input.charAt(i) != input.charAt(i+1))
            {
               cnt[input.charAt(i)-'a'][input.charAt(i+1)-'a']++;
               cnt[input.charAt(i+1)-'a'][input.charAt(i)-'a']++;
            }
         int[] dp = new int[1 << M];
         Arrays.fill(dp, Integer.MAX_VALUE);
         dp[0] = 0;
         for(int mask=0; mask < dp.length; mask++)
            for(int b=0; b < M; b++)
               if((mask&(1<<b)) == 0)
               {
                  int submask = mask|(1<<b);
                  int cost = 0;
                  for(int c=0; c < M; c++)
                  {
                     if((mask&(1<<c)) > 0)
                        cost += cnt[b][c];
                     else
                        cost -= cnt[b][c];
                  }
                  dp[submask] = Math.min(dp[submask], dp[mask]+cost*Integer.bitCount(mask));
               }
         System.out.println(dp[(1<<M)-1]);
      }
   }


/**
 * @author Juan Sebastian Beltran Rojas
 * @mail jsbeltran.valhalla@gmail.com
 * @veredict
 * @url https://codeforces.com/problemset/problem/1238/E
 * @category dp
 * @date 19/10/2019
 **/

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;

import static java.lang.Integer.bitCount;
import static java.lang.Integer.parseInt;

public class CF1238E {
    static long[][] Q;
    static int N;
    static int M;
    static long[] mem;
    static long[] sums;

    public static void main(String args[]) throws Throwable {
        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
        for (String ln; (ln = in.readLine()) != null; ) {
            StringTokenizer st = new StringTokenizer(ln);
            N = parseInt(st.nextToken());
            M = parseInt(st.nextToken());
            char[] S = in.readLine().toCharArray();
            Q = new long[M][M];
            mem = new long[1<<M];
            Arrays.fill(mem, -1);
            for (int i = 1; i < N; i++)
                Q[S[i - 1] - 'a'][S[i] - 'a'] = Q[S[i] - 'a'][S[i - 1] - 'a'] = Q[S[i - 1] - 'a'][S[i] - 'a'] + 1;
            calculateSums();
            for(int i=(1<<M)-1;i>=0;i--)
                f(i);
            System.out.println(f(0));
        }
    }

    static void calculateSums() {
        sums = new long[1<<M];
        for(int u=0;u<(1<<M);u++) {
            for (int j = 0; j < M; j++)
                for (int k = 0; k < M; k++)
                    if ((u & (1 << j)) == 0 && (u & (1 << k)) != 0 && k != j)
                        sums[u] += Q[k][j];
        }
    }

    static long f(int u) {
        if (bitCount(u) == M) return 0;
        if(mem[u]>=0)
            return mem[u];
        long min = 10000000000L;
        for (int i = 0; i < M; i++)
            if ((u & (1 << i)) == 0) {
                u = u | (1 << i);
                min = Math.min(f(u) + sums[u], min);
                u = u ^ (1 << i);
            }
        return mem[u]=min;
    }
}


/**
 * @author Juan Sebastian Beltran Rojas
 * @mail jsbeltran.valhalla@gmail.com
 * @veredict
 * @url https://codeforces.com/problemset/problem/1238/E
 * @category dp
 * @date 19/10/2019
 **/

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;

import static java.lang.Integer.bitCount;
import static java.lang.Integer.parseInt;

public class CF1238E {
    static int[][] Q;
    static int N;
    static int M;
    static int[] mem;

    public static void main(String args[]) throws Throwable {
        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
        for (String ln; (ln = in.readLine()) != null; ) {
            StringTokenizer st = new StringTokenizer(ln);
            N = parseInt(st.nextToken());
            M = parseInt(st.nextToken());
            char[] S = in.readLine().toCharArray();
            Q = new int[M][M];
            mem = new int[1<<M];
            Arrays.fill(mem, -1);
            for (int i = 1; i < N; i++)
                Q[S[i - 1] - 'a'][S[i] - 'a'] = Q[S[i] - 'a'][S[i - 1] - 'a'] = Q[S[i - 1] - 'a'][S[i] - 'a'] + 1;
            System.out.println(f(0));
        }
    }

    static int f(int u) {
        if (bitCount(u) == M) return 0;
        if(mem[u]>=0)
            return mem[u];
        int min = Integer.MAX_VALUE;
        int S = 0;
        for (int j = 0; j < M; j++)
            for (int k = 0; k < M; k++)
                if ((u & (1 << j)) == 0 && (u & (1 << k)) != 0 && k != j)
                    S += Q[k][j];
        for (int i = 0; i < M; i++)
            if ((u & (1 << i)) == 0) {
                u = u | (1 << i);
                int s = f(u) + S;
                for (int j = 0; j < M; j++)
                    if ((u & (1 << j)) == 0)
                        s += Q[i][j];
                    else if(i!=j)
                        s -= Q[i][j];
                min = Math.min(s, min);
                u = u ^ (1 << i);
            }
        return mem[u]=min;
    }
}


/**
 * @author Juan Sebastian Beltran Rojas
 * @mail jsbeltran.valhalla@gmail.com
 * @veredict
 * @url https://codeforces.com/problemset/problem/1238/E
 * @category dp
 * @date 19/10/2019
 **/

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;

import static java.lang.Integer.bitCount;
import static java.lang.Integer.parseInt;

public class CF1238E {
    static long[][] Q;
    static int N;
    static int M;
    static long[] mem;
    static long[] sums;

    public static void main(String args[]) throws Throwable {
        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
        for (String ln; (ln = in.readLine()) != null; ) {
            StringTokenizer st = new StringTokenizer(ln);
            N = parseInt(st.nextToken());
            M = parseInt(st.nextToken());
            char[] S = in.readLine().toCharArray();
            Q = new long[M][M];
            mem = new long[1 << M];
            Arrays.fill(mem, -1);
            for (int i = 1; i < N; i++)
                Q[S[i - 1] - 'a'][S[i] - 'a'] = Q[S[i] - 'a'][S[i - 1] - 'a'] = Q[S[i - 1] - 'a'][S[i] - 'a'] + 1;
            calculateSums();
            for (int i = (1 << M) - 1; i >= 0; i--)
                f(i);
            System.out.println(f(0));
        }
    }

    static void calculateSums() {
        sums = new long[1 << M];
        for (int u = 0; u < (1 << M); u++) {
            for (int j = 0; j < M; j++)
                for (int k = j + 1; k < M; k++)
                    if ((u & (1 << j)) != (u & (1 << k)))
                        sums[u] += Q[k][j];
        }
    }

    static long f(int u) {
        if (bitCount(u) == M) return 0;
        if (mem[u] >= 0)
            return mem[u];
        long min = 10000000000L;
        for (int i = 0; i < M; i++)
            if ((u & (1 << i)) == 0) {
                u = u | (1 << i);
                min = Math.min(f(u) + sums[u], min);
                u = u ^ (1 << i);
            }
        return mem[u] = min;
    }
}


/**
 * @author Juan Sebastian Beltran Rojas
 * @mail jsbeltran.valhalla@gmail.com
 * @veredict
 * @url https://codeforces.com/problemset/problem/1238/E
 * @category dp
 * @date 19/10/2019
 **/

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;

import static java.lang.Integer.bitCount;
import static java.lang.Integer.parseInt;

public class CF1238E {
    static long[][] Q;
    static int N;
    static int M;
    static long[] mem;
    static long[] sums;

    public static void main(String args[]) throws Throwable {
        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
        for (String ln; (ln = in.readLine()) != null; ) {
            StringTokenizer st = new StringTokenizer(ln);
            N = parseInt(st.nextToken());
            M = parseInt(st.nextToken());
            char[] S = in.readLine().toCharArray();
            Q = new long[M][M];
            mem = new long[1 << M];
            Arrays.fill(mem, -1);
            for (int i = 1; i < N; i++)
                Q[S[i - 1] - 'a'][S[i] - 'a'] = Q[S[i] - 'a'][S[i - 1] - 'a'] = Q[S[i - 1] - 'a'][S[i] - 'a'] + 1;
            calculateSums();
            for (int i = (1 << M) - 1; i >= 0; i--)
                f(i);
            System.out.println(f(0));
        }
    }

    static void calculateSums() {
        sums = new long[1 << M];
        for (int u = 0; u < (1 << M); u++) {
            for (int j = 0; j < M; j++)
                for (int k = j + 1; k < M; k++)
                    if (((u & (1 << j)) == 0 && (u & (1 << k)) != 0) ||
                            ((u & (1 << j)) != 0 && (u & (1 << k)) == 0))
                        sums[u] += Q[j][k];
        }
    }

    static long f(int u) {
        if (bitCount(u) == M) return 0;
        if (mem[u] >= 0)
            return mem[u];
        long min = 10000000000L;
        for (int i = 0; i < M; i++)
            if ((u & (1 << i)) == 0) {
                u = u | (1 << i);
                min = Math.min(f(u) + sums[u], min);
                u = u ^ (1 << i);
            }
        return mem[u] = min;
    }
}


/**
 * @author Juan Sebastian Beltran Rojas
 * @mail jsbeltran.valhalla@gmail.com
 * @veredict
 * @url https://codeforces.com/problemset/problem/1238/E
 * @category dp
 * @date 19/10/2019
 **/

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;

import static java.lang.Integer.bitCount;
import static java.lang.Integer.parseInt;

public class CF1238E {
    static long[][] Q;
    static int N;
    static int M;
    static long[] mem;
    static long[] sums;

    public static void main(String args[]) throws Throwable {
        //BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
        BufferedReader in = new BufferedReader(new FileReader("in.in"));
        for (String ln; (ln = in.readLine()) != null; ) {
            StringTokenizer st = new StringTokenizer(ln);
            N = parseInt(st.nextToken());
            M = parseInt(st.nextToken());
            char[] S = in.readLine().toCharArray();
            Q = new long[M][M];
            mem = new long[1 << M];
            Arrays.fill(mem, -1);
            for (int i = 1; i < N; i++)
                Q[S[i - 1] - 'a'][S[i] - 'a'] = Q[S[i] - 'a'][S[i - 1] - 'a'] = Q[S[i - 1] - 'a'][S[i] - 'a'] + 1;
            calculateSums();
            for (int i = (1 << M) - 1; i >= 0; i--)
                f(i);
            System.out.println(f(0));
        }
    }

    static void calculateSums() {
        sums = new long[1 << M];
        Arrays.fill(sums, -1);
        for (int u = 0; u < (1 << M); u++) {
            if(sums[u]==-1) {
                for (int j = 0; j < M; j++)
                    for (int k = j + 1; k < M; k++)
                        if (((u & (1 << j)) == 0 && (u & (1 << k)) != 0) ||
                                ((u & (1 << j)) != 0 && (u & (1 << k)) == 0))
                            sums[u] += Q[j][k];
                int neg = (~u)&((1<<M)-1);
                sums[neg] = sums[u];
            }
        }
    }

    static long f(int u) {
        if (bitCount(u) == M) return 0;
        if (mem[u] >= 0)
            return mem[u];
        long min = 10000000000L;
        for (int i = 0; i < M; i++)
            if ((u & (1 << i)) == 0) {
                u = u | (1 << i);
                min = Math.min(f(u) + sums[u], min);
                u = u ^ (1 << i);
            }
        return mem[u] = min;
    }
}


/**
 * @author Juan Sebastian Beltran Rojas
 * @mail jsbeltran.valhalla@gmail.com
 * @veredict
 * @url https://codeforces.com/problemset/problem/1238/E
 * @category dp
 * @date 19/10/2019
 **/

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;

import static java.lang.Integer.bitCount;
import static java.lang.Integer.parseInt;

public class CF1238E {
    static int[][] Q;
    static int N;
    static int M;
    static int[] mem;
    static int[] sums;

    public static void main(String args[]) throws Throwable {
        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
        for (String ln; (ln = in.readLine()) != null; ) {
            StringTokenizer st = new StringTokenizer(ln);
            N = parseInt(st.nextToken());
            M = parseInt(st.nextToken());
            char[] S = in.readLine().toCharArray();
            Q = new int[M][M];
            mem = new int[1<<M];
            Arrays.fill(mem, -1);
            for (int i = 1; i < N; i++)
                Q[S[i - 1] - 'a'][S[i] - 'a'] = Q[S[i] - 'a'][S[i - 1] - 'a'] = Q[S[i - 1] - 'a'][S[i] - 'a'] + 1;
            calculateSums();
            for(int i=(1<<M)-1;i>=0;i--)
                f(i);
            System.out.println(f(0));
        }
    }

    static void calculateSums() {
        sums = new int[1<<M];
        for(int u=0;u<(1<<M);u++) {
            for (int j = 0; j < M; j++)
                for (int k = 0; k < M; k++)
                    if ((u & (1 << j)) == 0 && (u & (1 << k)) != 0 && k != j)
                        sums[u] += Q[k][j];
        }
    }

    static int f(int u) {
        if (bitCount(u) == M) return 0;
        if(mem[u]>=0)
            return mem[u];
        int min = Integer.MAX_VALUE;
        for (int i = 0; i < M; i++)
            if ((u & (1 << i)) == 0) {
                u = u | (1 << i);
                min = Math.min(f(u) + sums[u], min);
                u = u ^ (1 << i);
            }
        return mem[u]=min;
    }
}


/**
 * @author Juan Sebastian Beltran Rojas
 * @mail jsbeltran.valhalla@gmail.com
 * @veredict
 * @url https://codeforces.com/problemset/problem/1238/E
 * @category dp
 * @date 19/10/2019
 **/

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;

import static java.lang.Integer.bitCount;
import static java.lang.Integer.parseInt;

public class CF1238E {
    static int[][] Q;
    static int N;
    static int M;
    static int[] mem;

    public static void main(String args[]) throws Throwable {
        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
        for (String ln; (ln = in.readLine()) != null; ) {
            StringTokenizer st = new StringTokenizer(ln);
            N = parseInt(st.nextToken());
            M = parseInt(st.nextToken());
            char[] S = in.readLine().toCharArray();
            Q = new int[M][M];
            mem = new int[1<<M];
            Arrays.fill(mem, -1);
            for (int i = 1; i < N; i++)
                Q[S[i - 1] - 'a'][S[i] - 'a'] = Q[S[i] - 'a'][S[i - 1] - 'a'] = Q[S[i - 1] - 'a'][S[i] - 'a'] + 1;
            for(int i=(1<<M)-1;i>=0;i--)
                f(i);
            System.out.println(f(0));
        }
    }

    static int f(int u) {
        if (bitCount(u) == M) return 0;
        if(mem[u]>=0)
            return mem[u];
        int min = Integer.MAX_VALUE;
        int S = 0;
        for (int j = 0; j < M; j++)
            for (int k = 0; k < M; k++)
                if ((u & (1 << j)) == 0 && (u & (1 << k)) != 0 && k != j)
                    S += Q[k][j];
        for (int i = 0; i < M; i++)
            if ((u & (1 << i)) == 0) {
                u = u | (1 << i);
                int s = f(u) + S;
                for (int j = 0; j < M; j++)
                    if ((u & (1 << j)) == 0)
                        s += Q[i][j];
                    else if(i!=j)
                        s -= Q[i][j];
                min = Math.min(s, min);
                u = u ^ (1 << i);
            }
        return mem[u]=min;
    }
}


/**
 * @author Juan Sebastian Beltran Rojas
 * @mail jsbeltran.valhalla@gmail.com
 * @veredict
 * @url https://codeforces.com/problemset/problem/1238/E
 * @category dp
 * @date 19/10/2019
 **/

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;

import static java.lang.Integer.bitCount;
import static java.lang.Integer.parseInt;

public class CF1238E {
    static int[][] Q;
    static int N;
    static int M;
    static int[] mem;

    public static void main(String args[]) throws Throwable {
        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
        for (String ln; (ln = in.readLine()) != null; ) {
            StringTokenizer st = new StringTokenizer(ln);
            N = parseInt(st.nextToken());
            M = parseInt(st.nextToken());
            char[] S = in.readLine().toCharArray();
            Q = new int[M][M];
            mem = new int[1<<M];
            Arrays.fill(mem, -1);
            for (int i = 1; i < N; i++)
                Q[S[i - 1] - 'a'][S[i] - 'a'] = Q[S[i] - 'a'][S[i - 1] - 'a'] = Q[S[i - 1] - 'a'][S[i] - 'a'] + 1;
            for(int i=(1<<N)-1;i>=0;i--)
                f(i);
            System.out.println(f(0));
        }
    }

    static int f(int u) {
        if (bitCount(u) == M) return 0;
        if(mem[u]>=0)
            return mem[u];
        int min = Integer.MAX_VALUE;
        int S = 0;
        for (int j = 0; j < M; j++)
            for (int k = 0; k < M; k++)
                if ((u & (1 << j)) == 0 && (u & (1 << k)) != 0 && k != j)
                    S += Q[k][j];
        for (int i = 0; i < M; i++)
            if ((u & (1 << i)) == 0) {
                u = u | (1 << i);
                int s = f(u) + S;
                for (int j = 0; j < M; j++)
                    if ((u & (1 << j)) == 0)
                        s += Q[i][j];
                    else if(i!=j)
                        s -= Q[i][j];
                min = Math.min(s, min);
                u = u ^ (1 << i);
            }
        return mem[u]=min;
    }
}


/**
 * @author Juan Sebastian Beltran Rojas
 * @mail jsbeltran.valhalla@gmail.com
 * @veredict
 * @url https://codeforces.com/problemset/problem/1238/E
 * @category dp
 * @date 19/10/2019
 **/

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;

import static java.lang.Integer.bitCount;
import static java.lang.Integer.parseInt;

public class CF1238E {
    static long[][] Q;
    static int N;
    static int M;
    static long[] mem;
    static long[] sums;

    public static void main(String args[]) throws Throwable {
        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
        for (String ln; (ln = in.readLine()) != null; ) {
            StringTokenizer st = new StringTokenizer(ln);
            N = parseInt(st.nextToken());
            M = parseInt(st.nextToken());
            char[] S = in.readLine().toCharArray();
            Q = new long[M][M];
            mem = new long[1 << M];
            Arrays.fill(mem, -1);
            for (int i = 1; i < N; i++)
                Q[S[i - 1] - 'a'][S[i] - 'a'] = Q[S[i] - 'a'][S[i - 1] - 'a'] = Q[S[i - 1] - 'a'][S[i] - 'a'] + 1;
            calculateSums();
            for (int i = (1 << M) - 1; i >= 0; i--)
                f(i);
            System.out.println(f(0));
        }
    }

    static void calculateSums() {
        sums = new long[1 << M];
        Arrays.fill(sums, -1);
        for (int u = 0; u < (1 << M); u++) {
            if (sums[u] == -1) {
                for (int j = 0; j < M; j++)
                    for (int k = j + 1; k < M; k++)
                        if (((u & (1 << j)) == 0 && (u & (1 << k)) != 0) ||
                                ((u & (1 << j)) != 0 && (u & (1 << k)) == 0))
                            sums[u] += Q[j][k];
                int neg = (~u) & ((1 << M) - 1);
                sums[neg] = sums[u];
            }
        }
    }

    static long f(int u) {
        if (bitCount(u) == M) return 0;
        if (mem[u] >= 0)
            return mem[u];
        long min = 10000000000L;
        for (int i = 0; i < M; i++)
            if ((u & (1 << i)) == 0) {
                u = u | (1 << i);
                min = Math.min(f(u) + sums[u], min);
                u = u ^ (1 << i);
            }
        return mem[u] = min;
    }
}


/**
 * @author Juan Sebastian Beltran Rojas
 * @mail jsbeltran.valhalla@gmail.com
 * @veredict
 * @url https://codeforces.com/problemset/problem/1238/E
 * @category dp
 * @date 19/10/2019
 **/

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

import static java.lang.Integer.bitCount;
import static java.lang.Integer.parseInt;

public class CF1238E {
    static int[][] Q;
    static int N;
    static int M;
    static int[] mem;

    public static void main(String args[]) throws Throwable {
        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
        for (String ln; (ln = in.readLine()) != null; ) {
            StringTokenizer st = new StringTokenizer(ln);
            N = parseInt(st.nextToken());
            M = parseInt(st.nextToken());
            char[] S = in.readLine().toCharArray();
            Q = new int[M][M];
            mem = new int[1<<N];
            for (int i = 1; i < N; i++)
                Q[S[i - 1] - 'a'][S[i] - 'a'] = Q[S[i] - 'a'][S[i - 1] - 'a'] = Q[S[i - 1] - 'a'][S[i] - 'a'] + 1;
            System.out.println(f(0));
        }
    }

    static int f(int u) {
        if (bitCount(u) == M) return 0;
        if(mem[u]>0)return mem[u];
        int min = Integer.MAX_VALUE;
        int S = 0;
        for (int j = 0; j < M; j++)
            for (int k = 0; k < M; k++)
                if ((u & (1 << j)) == 0 && (u & (1 << k)) != 0 && k != j)
                    S += Q[k][j];
        for (int i = 0; i < M; i++)
            if ((u & (1 << i)) == 0) {
                u = u | (1 << i);
                int s = f(u) + S;
                for (int j = 0; j < M; j++)
                    if ((u & (1 << j)) == 0)
                        s += Q[i][j];
                    else if(i!=j)
                        s -= Q[i][j];
                min = Math.min(s, min);
                u = u ^ (1 << i);
            }
        return mem[u]=min;
    }
}


/**
 * @author Juan Sebastian Beltran Rojas
 * @mail jsbeltran.valhalla@gmail.com
 * @veredict
 * @url https://codeforces.com/problemset/problem/1238/E
 * @category dp
 * @date 19/10/2019
 **/

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;

import static java.lang.Integer.bitCount;
import static java.lang.Integer.parseInt;

public class CF1238E {
    static long[][] Q;
    static int N;
    static int M;
    static long[] mem;
    static long[] sums;

    public static void main(String args[]) throws Throwable {
        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
        for (String ln; (ln = in.readLine()) != null; ) {
            StringTokenizer st = new StringTokenizer(ln);
            N = parseInt(st.nextToken());
            M = parseInt(st.nextToken());
            char[] S = in.readLine().toCharArray();
            Q = new long[M][M];
            mem = new long[1 << M];
            Arrays.fill(mem, -1);
            for (int i = 1; i < N; i++)
                Q[S[i - 1] - 'a'][S[i] - 'a'] = Q[S[i] - 'a'][S[i - 1] - 'a'] = Q[S[i - 1] - 'a'][S[i] - 'a'] + 1;
            calculateSums();
            for (int i = (1 << M) - 1; i >= 0; i--)
                f(i);
            System.out.println(f(0));
        }
    }

    static void calculateSums() {
        sums = new long[1 << M];
        Arrays.fill(sums, -1);
        for (int u = 0; u < (1 << M); u++) {
            if (sums[u] == -1) {
                sums[u] = 0;
                for (int j = 0; j < M; j++)
                    for (int k = j + 1; k < M; k++)
                        if (((u & (1 << j)) == 0 && (u & (1 << k)) != 0) ||
                                ((u & (1 << j)) != 0 && (u & (1 << k)) == 0))
                            sums[u] += Q[j][k];
                int neg = (~u) & ((1 << M) - 1);
                sums[neg] = sums[u];
            }
        }
    }

    static long f(int u) {
        if (bitCount(u) == M) return 0;
        if (mem[u] >= 0)
            return mem[u];
        long min = 10000000000L;
        for (int i = 0; i < M; i++)
            if ((u & (1 << i)) == 0) {
                u = u | (1 << i);
                min = Math.min(f(u) + sums[u], min);
                u = u ^ (1 << i);
            }
        return mem[u] = min;
    }
}


import java.util.*;
import java.io.*;

public class e
{
	public static void main(String[] args) throws IOException
	{new e();}

	FastScanner in = new FastScanner(System.in);
	PrintWriter out = new PrintWriter(System.out);

	int n, m, oo = 1 << 28;
	int[] dp, bit;
	int[][] to, pre;
	char[] w, alph = "abcdefghijklmnopqrstuvwxyz".toCharArray();

	e() throws IOException
	{
		n = in.nextInt();
		m = in.nextInt();
		w = in.next().toCharArray();
		to = new int[m+1][m+1];
		for (int i = 0; i < n-1; i++)
		{
			int a = w[i]-'a';
			int b = w[i+1]-'a';
			if (a == b)
				continue;
			to[a][b]++;
			to[b][a]++;
		}

//		for (int[] row : to)
//			out.println(Arrays.toString(row));

		bit = new int[1 << m];
		pre = new int[m][1 << m];
		for (int i = 0; i < (1 << m); i++)
		{
			bit[i] = Integer.bitCount(i);
			for (int j = 0; j < m; j++)
			{
				if (((1 << j) & i) == 0)
					continue;
				for (int k = 0; k < m; k++)
				{
					if (j == k)
						continue;
					if (((1 << k) & i) > 0)
						pre[j][i] -= to[j][k];
					else
						pre[j][i] += to[j][k];
				}
			}
		}

//		int use = (1 << m)-1;
//		for (int i = 0; i < (1 << m); i++)
//			for (int j = 0; j < m; j++)
//				out.printf("%s %d %d%n", Integer.toBinaryString(use), j, pre[j][use]);

		Arrays.fill(dp = new int[1 << m], oo);
		dp[0] = 0;
		out.println(dp((1 << m)-1));
//		out.println(Arrays.toString(dp));
//		out.println();
		out.close();
	}

	int dp(int mask)
	{
//		out.printf("entering call: (%s)%n", Integer.toBinaryString(mask));
		if (dp[mask] != oo)
		{
//			out.printf("\t returning from: (%s)%n", Integer.toBinaryString(mask));
//			out.printf("\t --------> %d%n", dp[mask]);
			return dp[mask];
		}

		int ans = oo, put = m-bit[mask]+1;
		for (int i = 0; i <= m; i++)
			if (((1 << i) & mask) > 0)
			{
//				out.printf("\t adding %d*%d = %d to next call%n", put, pre[i][mask], put*pre[i][mask]);
				ans = Math.min(ans, put*pre[i][mask]+dp(mask-(1 << i)));
			}

//		out.printf("\t returning from: (%s)%n", Integer.toBinaryString(mask));
//		out.printf("\t --------> %d%n", ans);
		return dp[mask] = Math.min(ans, dp[mask]);
	}

	void sort(int[] x)
	{
		int sz = x.length;
		Random r = new Random();
		for (int i = 0; i < sz; i++)
		{
			int j = r.nextInt(sz);
			x[i] = x[j]-(x[i]-(x[j] = x[i]));
		}
		Arrays.sort(x);
	}

	class FastScanner {
		BufferedReader br;
		StringTokenizer st;
		public FastScanner(InputStream i) {
		    br = new BufferedReader(new InputStreamReader(i));
		    st = new StringTokenizer("");
		}
		public String next() throws IOException {
		    if(st.hasMoreTokens())
		        return st.nextToken();
		    else
		        st = new StringTokenizer(br.readLine());
		    return next();
		}
		public int nextInt() throws IOException {
		    return Integer.parseInt(next());
		}
		public int[] intarr(int n) throws IOException {
			int[] res = new int[n];
			for (int i = 0; i < n; i++)
				res[i] = nextInt();
			return res;
		}
	    public long nextLong() throws IOException {
		    return Long.parseLong(next());
		}
		public double nextDouble() throws IOException {
		    return Double.parseDouble(next());
		}
    }
}


import java.util.*;
import java.io.*;

public class e
{
	public static void main(String[] args) throws IOException
	{new e();}

	FastScanner in = new FastScanner(System.in);
	PrintWriter out = new PrintWriter(System.out);

	int n, m, oo = 1 << 28;
	int[] dp, bit, cost;
	int[][] to, pre;
	char[] w;

	e() throws IOException
	{
		n = in.nextInt();
		m = in.nextInt();
		w = in.next().toCharArray();
		to = new int[m+1][m+1];
		for (int i = 0; i < n-1; i++)
		{
			int a = w[i]-'a';
			int b = w[i+1]-'a';
			if (a == b)
				continue;
			to[a][b]++;
			to[b][a]++;
		}

//		for (int[] row : to)
//			out.println(Arrays.toString(row));

//		bit = new int[1 << m];
//		pre = new int[m][1 << m];
		cost = new int[1 << m];
//		for (int i = 0; i < (1 << m); i++)
//		{
//			bit[i] = Integer.bitCount(i);
//			for (int j = 0; j < m; j++)
//			{
//				if (((1 << j) & i) == 0)
//					continue;
//				for (int k = 0; k < m; k++)
//				{
//					if (j == k)
//						continue;
//					if (((1 << k) & i) > 0)
//						pre[j][i] -= to[j][k];
//					else
//						pre[j][i] += to[j][k];
//				}
//				pre[j][i] *= (m-bit[i]+1);
//				cost[i] += pre[j][i];
//			}
//		}

		for (int i = 0; i < (1 << m); i++)
			for (int j = 0; j < m; j++)
				for (int k = 0; k < m; k++)
					// if only one of the bit j/k is on in i
					// ie one has been placed and the other has not
					// summing this over each mask a difference occurs in gives the correct difference total * 2
					if ((((i >> j) ^ (i >> k)) & 1) > 0)
						cost[i] += to[j][k];

//		int use = (1 << m)-1;
//		for (int i = 0; i < (1 << m); i++)
//			for (int j = 0; j < m; j++)
//				out.printf("%s %d %d%n", Integer.toBinaryString(use), j, pre[j][use]);

		Arrays.fill(dp = new int[1 << m], oo);
		dp[0] = 0;
		for (int i = 1; i < (1 << m); i++)
		{
			for (int j = 0; j < m; j++)
				if (((i >> j) & 1) > 0)
					dp[i] = Math.min(dp[i], dp[i ^ (1 << j)]);
			dp[i] += cost[i];
		}
		out.println(dp[(1 << m)-1]/2);
//		out.println(dp((1 << m)-1));
//		out.println(Arrays.toString(dp));
//		out.println();
		out.close();
	}

	int dp(int mask)
	{
//		out.printf("entering call: (%s)%n", Integer.toBinaryString(mask));
		if (dp[mask] != oo)
		{
//			out.printf("\t returning from: (%s)%n", Integer.toBinaryString(mask));
//			out.printf("\t --------> %d%n", dp[mask]);
			return dp[mask];
		}

		int ans = oo, put = m-bit[mask]+1;
		for (int i = 0; i <= m; i++)
			if (((1 << i) & mask) > 0)
			{
//				out.printf("\t adding %d*%d = %d to next call%n", put, pre[i][mask], put*pre[i][mask]);
				ans = Math.min(ans, put*pre[i][mask]+dp(mask-(1 << i)));
			}

//		out.printf("\t returning from: (%s)%n", Integer.toBinaryString(mask));
//		out.printf("\t --------> %d%n", ans);
		return dp[mask] = Math.min(ans, dp[mask]);
	}

	void sort(int[] x)
	{
		int sz = x.length;
		Random r = new Random();
		for (int i = 0; i < sz; i++)
		{
			int j = r.nextInt(sz);
			x[i] = x[j]-(x[i]-(x[j] = x[i]));
		}
		Arrays.sort(x);
	}

	class FastScanner {
		BufferedReader br;
		StringTokenizer st;
		public FastScanner(InputStream i) {
		    br = new BufferedReader(new InputStreamReader(i));
		    st = new StringTokenizer("");
		}
		public String next() throws IOException {
		    if(st.hasMoreTokens())
		        return st.nextToken();
		    else
		        st = new StringTokenizer(br.readLine());
		    return next();
		}
		public int nextInt() throws IOException {
		    return Integer.parseInt(next());
		}
		public int[] intarr(int n) throws IOException {
			int[] res = new int[n];
			for (int i = 0; i < n; i++)
				res[i] = nextInt();
			return res;
		}
	    public long nextLong() throws IOException {
		    return Long.parseLong(next());
		}
		public double nextDouble() throws IOException {
		    return Double.parseDouble(next());
		}
    }
}


import java.util.*;
import java.io.*;

public class E
{
	public static void main(String[] args) throws IOException
	{new E();}

	FastScanner in = new FastScanner(System.in);
	PrintWriter out = new PrintWriter(System.out);

	int n, m, oo = 1 << 28;
	int[] dp, cost;
	int[][] to;
	char[] w;

	E() throws IOException
	{
		n = in.nextInt();
		m = in.nextInt();
		w = in.next().toCharArray();
		to = new int[m+1][m+1];
		for (int i = 0; i < n-1; i++)
			if (w[i] != w[i+1])
			{
				to[w[i]-'a'][w[i+1]-'a']++;
				to[w[i+1]-'a'][w[i]-'a']++;
			}

		cost = new int[1 << m];
		for (int i = 0; i < (1 << m); i++)
			for (int j = 0; j < m; j++)
			{
				if (((1 << j) & i) > 0)
					continue;
				for (int k = 0; k < m; k++)
				{
					if (((1 << k) & i) == 0)
						continue;
					cost[i] += to[j][k];
				}
			}

		dp = new int[1 << m];
		Arrays.fill(dp, oo);
		dp[0] = 0;
		for (int i = 1; i < (1 << m); i++)
		{
			for (int j = 0; j < m; j++)
				if (((i >> j) & 1) > 0)
					dp[i] = Math.min(dp[i], dp[i ^ (1 << j)]);
			dp[i] += cost[i];
		}
		out.println(dp[(1 << m)-1]);
		out.close();
	}

	void sort(int[] x)
	{
		int sz = x.length;
		Random r = new Random();
		for (int i = 0; i < sz; i++)
		{
			int j = r.nextInt(sz);
			x[i] = x[j]-(x[i]-(x[j] = x[i]));
		}
		Arrays.sort(x);
	}

	class FastScanner {
		BufferedReader br;
		StringTokenizer st;
		public FastScanner(InputStream i) {
		    br = new BufferedReader(new InputStreamReader(i));
		    st = new StringTokenizer("");
		}
		public String next() throws IOException {
		    if(st.hasMoreTokens())
		        return st.nextToken();
		    else
		        st = new StringTokenizer(br.readLine());
		    return next();
		}
		public int nextInt() throws IOException {
		    return Integer.parseInt(next());
		}
		public int[] intarr(int n) throws IOException {
			int[] res = new int[n];
			for (int i = 0; i < n; i++)
				res[i] = nextInt();
			return res;
		}
	    public long nextLong() throws IOException {
		    return Long.parseLong(next());
		}
		public double nextDouble() throws IOException {
		    return Double.parseDouble(next());
		}
    }
}


import java.util.*;
import java.io.*;

public class E
{
	public static void main(String[] args) throws IOException
	{new E();}

	FastScanner in = new FastScanner(System.in);
	PrintWriter out = new PrintWriter(System.out);

	int n, m, oo = 1 << 28;
	int[] dp, cost;
	int[][] to;
	char[] w;

	E() throws IOException
	{
		n = in.nextInt();
		m = in.nextInt();
		w = in.next().toCharArray();
		to = new int[m+1][m+1];
		for (int i = 0; i < n-1; i++)
			if (w[i] != w[i+1])
			{
				to[w[i]-'a'][w[i+1]-'a']++;
				to[w[i+1]-'a'][w[i]-'a']++;
			}

		cost = new int[1 << m];
		for (int i = 0; i < (1 << m); i++)
			for (int j = 0; j < m; j++)
			{
				if (((1 << j) & i) == 0)
					continue;
				for (int k = 0; k < m; k++)
				{
					if (((1  << j) & mask) > 0)
						continue;
					cost[i] += to[j][k];
				}
			}

		dp = new int[1 << m];
		Arrays.fill(dp, oo);
		dp[0] = 0;
		for (int i = 1; i < (1 << m); i++)
		{
			for (int j = 0; j < m; j++)
				if (((i >> j) & 1) > 0)
					dp[i] = Math.min(dp[i], dp[i ^ (1 << j)]);
			dp[i] += cost[i];
		}
		dp[(1 << m)-1] >>= 1;
		out.println(dp[(1 << m)-1]);
		out.close();
	}

	void sort(int[] x)
	{
		int sz = x.length;
		Random r = new Random();
		for (int i = 0; i < sz; i++)
		{
			int j = r.nextInt(sz);
			x[i] = x[j]-(x[i]-(x[j] = x[i]));
		}
		Arrays.sort(x);
	}

	class FastScanner {
		BufferedReader br;
		StringTokenizer st;
		public FastScanner(InputStream i) {
		    br = new BufferedReader(new InputStreamReader(i));
		    st = new StringTokenizer("");
		}
		public String next() throws IOException {
		    if(st.hasMoreTokens())
		        return st.nextToken();
		    else
		        st = new StringTokenizer(br.readLine());
		    return next();
		}
		public int nextInt() throws IOException {
		    return Integer.parseInt(next());
		}
		public int[] intarr(int n) throws IOException {
			int[] res = new int[n];
			for (int i = 0; i < n; i++)
				res[i] = nextInt();
			return res;
		}
	    public long nextLong() throws IOException {
		    return Long.parseLong(next());
		}
		public double nextDouble() throws IOException {
		    return Double.parseDouble(next());
		}
    }
}


import java.util.*;
import java.io.*;

public class e
{
	public static void main(String[] args) throws IOException
	{new e();}

	FastScanner in = new FastScanner(System.in);
	PrintWriter out = new PrintWriter(System.out);

	int n, m, oo = 1 << 28;
	int[] dp, bit, cost, two;
	int[][] to, pre;
	char[] w;

	e() throws IOException
	{
		n = in.nextInt();
		m = in.nextInt();
		w = in.next().toCharArray();
		to = new int[m+1][m+1];
		for (int i = 0; i < n-1; i++)
			if (w[i] != w[i+1])
			{
				to[w[i]-'a'][w[i+1]-'a']++;
				to[w[i+1]-'a'][w[i]-'a']++;
			}

		two = new int[m+1];
		for (int i = 0; i <= m; i++)
			two[i] = (1 << i);

//		for (int[] row : to)
//			out.println(Arrays.toString(row));

//		bit = new int[1 << m];
//		pre = new int[m][1 << m];
		cost = new int[two[m]];
//		for (int i = 0; i < (1 << m); i++)
//		{
//			bit[i] = Integer.bitCount(i);
//			for (int j = 0; j < m; j++)
//			{
//				if (((1 << j) & i) == 0)
//					continue;
//				for (int k = 0; k < m; k++)
//				{
//					if (j == k)
//						continue;
//					if (((1 << k) & i) > 0)
//						pre[j][i] -= to[j][k];
//					else
//						pre[j][i] += to[j][k];
//				}
//				pre[j][i] *= (m-bit[i]+1);
//				cost[i] += pre[j][i];
//			}
//		}

		for (int i = 0; i < two[m]; i++)
			for (int j = 0; j < m; j++)
				for (int k = 0; k < m; k++)
					// if only one of the bit j/k is on in i
					// ie one has been placed and the other has not
					// summing this over each mask a difference occurs in gives the correct difference total * 2
					if ((((i >> j) ^ (i >> k)) & 1) > 0)
						cost[i] += to[j][k];

//		int use = (1 << m)-1;
//		for (int i = 0; i < (1 << m); i++)
//			for (int j = 0; j < m; j++)
//				out.printf("%s %d %d%n", Integer.toBinaryString(use), j, pre[j][use]);

		dp = new int[two[m]];
		Arrays.fill(dp, oo);
		dp[0] = 0;
		for (int i = 1; i < two[m]; i++)
		{
			for (int j = 0; j < m; j++)
				if (((i >> j) & 1) > 0)
					dp[i] = Math.min(dp[i], dp[i ^ two[j]]);
			dp[i] += cost[i];
		}
		dp[two[m]-1] >>= 1;
		out.println(dp[two[m]-1]);
//		out.println(dp((1 << m)-1));
//		out.println(Arrays.toString(dp));
//		out.println();
		out.close();
	}

	int dp(int mask)
	{
//		out.printf("entering call: (%s)%n", Integer.toBinaryString(mask));
		if (dp[mask] != oo)
		{
//			out.printf("\t returning from: (%s)%n", Integer.toBinaryString(mask));
//			out.printf("\t --------> %d%n", dp[mask]);
			return dp[mask];
		}

		int ans = oo, put = m-bit[mask]+1;
		for (int i = 0; i <= m; i++)
			if (((1 << i) & mask) > 0)
			{
//				out.printf("\t adding %d*%d = %d to next call%n", put, pre[i][mask], put*pre[i][mask]);
				ans = Math.min(ans, put*pre[i][mask]+dp(mask-(1 << i)));
			}

//		out.printf("\t returning from: (%s)%n", Integer.toBinaryString(mask));
//		out.printf("\t --------> %d%n", ans);
		return dp[mask] = Math.min(ans, dp[mask]);
	}

	void sort(int[] x)
	{
		int sz = x.length;
		Random r = new Random();
		for (int i = 0; i < sz; i++)
		{
			int j = r.nextInt(sz);
			x[i] = x[j]-(x[i]-(x[j] = x[i]));
		}
		Arrays.sort(x);
	}

	class FastScanner {
		BufferedReader br;
		StringTokenizer st;
		public FastScanner(InputStream i) {
		    br = new BufferedReader(new InputStreamReader(i));
		    st = new StringTokenizer("");
		}
		public String next() throws IOException {
		    if(st.hasMoreTokens())
		        return st.nextToken();
		    else
		        st = new StringTokenizer(br.readLine());
		    return next();
		}
		public int nextInt() throws IOException {
		    return Integer.parseInt(next());
		}
		public int[] intarr(int n) throws IOException {
			int[] res = new int[n];
			for (int i = 0; i < n; i++)
				res[i] = nextInt();
			return res;
		}
	    public long nextLong() throws IOException {
		    return Long.parseLong(next());
		}
		public double nextDouble() throws IOException {
		    return Double.parseDouble(next());
		}
    }
}


import java.util.*;
import java.io.*;

public class e
{
	public static void main(String[] args) throws IOException
	{new e();}

	FastScanner in = new FastScanner(System.in);
	PrintWriter out = new PrintWriter(System.out);

	int n, m, oo = 1 << 28;
	int[] dp, bit, cost;
	int[][] to, pre;
	char[] w, alph = "abcdefghijklmnopqrstuvwxyz".toCharArray();

	e() throws IOException
	{
		n = in.nextInt();
		m = in.nextInt();
		w = in.next().toCharArray();
		to = new int[m+1][m+1];
		for (int i = 0; i < n-1; i++)
		{
			int a = w[i]-'a';
			int b = w[i+1]-'a';
			if (a == b)
				continue;
			to[a][b]++;
			to[b][a]++;
		}

//		for (int[] row : to)
//			out.println(Arrays.toString(row));

//		bit = new int[1 << m];
//		pre = new int[m][1 << m];
		cost = new int[1 << m];
//		for (int i = 0; i < (1 << m); i++)
//		{
//			bit[i] = Integer.bitCount(i);
//			for (int j = 0; j < m; j++)
//			{
//				if (((1 << j) & i) == 0)
//					continue;
//				for (int k = 0; k < m; k++)
//				{
//					if (j == k)
//						continue;
//					if (((1 << k) & i) > 0)
//						pre[j][i] -= to[j][k];
//					else
//						pre[j][i] += to[j][k];
//				}
//				pre[j][i] *= (m-bit[i]+1);
//				cost[i] += pre[j][i];
//			}
//		}

		for (int i = 0; i < (1 << m); i++)
			for (int j = 0; j < m; j++)
				for (int k = 0; k < m; k++)
					// if only one of the bit j/k is on in i
					// ie one has been placed and the other has not
					// summing this over each mask a difference occurs in gives the correct difference total * 2
					if ((((i >> j) ^ (i >> k)) & 1) > 0)
						cost[i] += to[j][k];

//		int use = (1 << m)-1;
//		for (int i = 0; i < (1 << m); i++)
//			for (int j = 0; j < m; j++)
//				out.printf("%s %d %d%n", Integer.toBinaryString(use), j, pre[j][use]);

		Arrays.fill(dp = new int[1 << m], oo);
		dp[0] = 0;
		for (int i = 0; i < (1 << m); i++)
		{
			if (i == 0)
				continue;
			for (int j = 0; j < m; j++)
				if (((i >> j) & 1) > 0)
					dp[i] = Math.min(dp[i], dp[i ^ (1 << j)]);
			dp[i] += cost[i];
		}
		out.println(dp[(1 << m)-1]/2);
//		out.println(dp((1 << m)-1));
//		out.println(Arrays.toString(dp));
//		out.println();
		out.close();
	}

	int dp(int mask)
	{
//		out.printf("entering call: (%s)%n", Integer.toBinaryString(mask));
		if (dp[mask] != oo)
		{
//			out.printf("\t returning from: (%s)%n", Integer.toBinaryString(mask));
//			out.printf("\t --------> %d%n", dp[mask]);
			return dp[mask];
		}

		int ans = oo, put = m-bit[mask]+1;
		for (int i = 0; i <= m; i++)
			if (((1 << i) & mask) > 0)
			{
//				out.printf("\t adding %d*%d = %d to next call%n", put, pre[i][mask], put*pre[i][mask]);
				ans = Math.min(ans, put*pre[i][mask]+dp(mask-(1 << i)));
			}

//		out.printf("\t returning from: (%s)%n", Integer.toBinaryString(mask));
//		out.printf("\t --------> %d%n", ans);
		return dp[mask] = Math.min(ans, dp[mask]);
	}

	void sort(int[] x)
	{
		int sz = x.length;
		Random r = new Random();
		for (int i = 0; i < sz; i++)
		{
			int j = r.nextInt(sz);
			x[i] = x[j]-(x[i]-(x[j] = x[i]));
		}
		Arrays.sort(x);
	}

	class FastScanner {
		BufferedReader br;
		StringTokenizer st;
		public FastScanner(InputStream i) {
		    br = new BufferedReader(new InputStreamReader(i));
		    st = new StringTokenizer("");
		}
		public String next() throws IOException {
		    if(st.hasMoreTokens())
		        return st.nextToken();
		    else
		        st = new StringTokenizer(br.readLine());
		    return next();
		}
		public int nextInt() throws IOException {
		    return Integer.parseInt(next());
		}
		public int[] intarr(int n) throws IOException {
			int[] res = new int[n];
			for (int i = 0; i < n; i++)
				res[i] = nextInt();
			return res;
		}
	    public long nextLong() throws IOException {
		    return Long.parseLong(next());
		}
		public double nextDouble() throws IOException {
		    return Double.parseDouble(next());
		}
    }
}


// No sorcery shall prevail. //
import java.util.*;
import java.io.*;
public class InVoker {
	//Variables
	static long mod = 1000000007;
	static long mod2 = 998244353;
	static FastReader inp= new FastReader();
	static PrintWriter out= new PrintWriter(System.out);
	public static void main(String args[]) {
	   	InVoker g=new InVoker();
	   	g.main();
	   	out.close();
	}

	int dp[];
	int freq[][];
	int m;

	//Main
	void main() {

		int n=inp.nextInt();
		m=inp.nextInt();
		String s=inp.next();
		dp=new int[1<<m];
		Arrays.fill(dp, -1);
		freq=new int[m][m];
		for(int i=0;i<n-1;i++) {
			int x=s.charAt(i)-'a';
			int y=s.charAt(i+1)-'a';
			if(x==y) continue;
			freq[x][y]++;
			freq[y][x]++;
		}
		out.println(go(0,0));

	}

	int go(int pos, int mask) {
		if(pos==m) return 0;
		if(dp[mask]!=-1) return dp[mask];
		int gg=Integer.MAX_VALUE;
		for(int i=0;i<m;i++) {
			if((mask>>i&1)==1) continue;
			int cost=0;
			for(int j=0;j<m;j++) {
				if((mask>>j&1)==1) cost+=freq[i][j]*pos;
				else cost-=freq[i][j]*pos;
			}
			cost+=go(pos+1,mask|(1<<i));
			gg=Math.min(gg, cost);
		}
		return dp[mask]=gg;
	}

	/*********************************************************************************************************************************************************************************************************
	 * ti;.                               .:,:i:         :,;;itt;.        fDDEDDEEEEEEKEEEEEKEEEEEEEEEEEEEEEEE###WKKKKKKKKKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWW#WWWWWKKKKKEE      :,:.    f::::. .,ijLGDDDDDDDEEEEEEE*
	 *ti;.                               .:,:i:          .:,;itt;:      GLDEEGEEEEEEEEEEEEEEEEEEDEEEEEEEEEEE#W#WEKKKKKKKKKKKKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWKKKKKKG.     .::.      f:,...,ijLGDDDDDDDDEEEEEE *
	 *ti;.                               .:,:i:            :,;;iti,    :fDDEEEEEEEEEEEEEEEKEEEEDEEEEEEEEEEEW##WEEEKKKKKKKKKKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWWKKKKKKEG     .::.       .f,::,ijLGDDDDDDDDEEEEEE *
	 *ti;.                               .:,:i:             .,,;iti;.  LDDEEEEEEEEEEKEEEEWEEEDDEEEEEEEEEEE#WWWEEEEEKKKKKKKKKKKKKKKKKKKKKKKKKWWWWWWWWWWWWWWWWWWWKKKKKEDj    .::.        .:L;;ijfGDDDDDDDDDEEEEE *
	 *ti;.                               .:,:i:              .:,;;iii:LLDEEEEEEEEEEEKEEEEEEEEDEEEEEEEEEEEW#WWEEEEEEEKKKKKKKKKKKKKKKKKKKKKKKKKWWKWWWWWWWWWWWWWWKKKKKKKEL    .::.         .:;LijLGGDDDDDDDDEEEEE *
	 *ti;.                               .:,:;:                :,;;ittfDEEEEEEEEEEEEEEEEKEEEGEEEEEEEEEEEKWWWEEEEEEEEEKKKKKKKKKKKKKKKKKKKKKKKKKKWWWWWWWWWWWWWWWKKKKKKKELj   .::.          :,;jffGGDDDDDDDDDEEEE *
	 *ti;.                               .:,:i:                 .,;;tGGDEEEEEEEEEEEKEEEKEEEDEEEEEEEEEEEEWWWEEEEEEEEEEEEKKKKKKKKKKKKKKKKKKKKKKKKKKWWWWWWKWWWWWWKKKKKKKEEL   .::.          .:;itDGGDDDDDDDDDEEEE *
	 *ti;.                               .:::;:                   :;ifDEEEEEEEEEEEEKEEEKEEEEEEEEEEEEEEEWWWEEEEEEEEEEEEEEKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKW#WWWKKKKKKKKEEf   .::.           :,itfGEDDDDDDDDDDDEE *
	 *ti;.                               .:::;:                    :GGEEEEEEEEEEEKEKEEKEEEEEEEEEEEEEEEEWWEEEEEEEEEEEEEEEEEKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKW#WKKKKKKKKKEEDG  .::.           .,;jfLGKDLDDDDDDEEDD *
	 *ti;.                               .:::;:                     fDEEEEEEKKKKKKKKKEKEEEEEEEEEEEEEEE#WEEEEEEEEEEEEEEEEEEKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKW#KKKKKKKKKKEEf .:::.           .,;tfLGDEDDDDDDDDEEE *
	 *ti;.                                :::;:                    fDEEEEEEKKKKKKKKKKWKEEEEEEEEEEEEEEEWKEEEEEEEEEEEEEEEEEEEEKEKKKKKKKKKKKKKKKKKKKKKKKKKKKKW##KKKKKKKKKEEft :::.           .,;tfLGDDDKDDDDDDDDD *
	 *ti;.                                .::;:                    fDEEEEEEKKKKKKKWKKKKKEEEEEEEEEEEEE#WEEWEEEEEDEEDEEEEEEEEEEEEKKKKKKKKKKKKKKKKKKKKKKKKKKKKW#WKKKKKKKKEEGG :,:.           .,;tfLGGDDDKDDDDDDDD *
	 *ti;.                                .:.;:                   tGDEEEEKKKKKKKKKKKKKKKKKEEEEEEEEEEEWEEKWEEEEEEEDEEEEEEEEEEEEEEKEKKKKKKKKKKKKKKKKKKKKKKKKKKWWWKKKKKKKEEDf :::.           .,;tfLGGDDDDEDDDDDDD *
	 *ti;.                                .::;:                   fDEEEEEKKKKKKKKKKKWKKKKKKKKEEEEEEEWWEEWEEEEEEEEEEEEEEEEEEEEEEEEEEKKKKKKKKKKKKKKKKKKKKKKKKKW##KKKKKKKEEEft.::.           .,;tfLGGDDDDDDEDDDDD *
	 *ti;.                                .:.;:                  tGDEEEKKKKKKKKKKKKKKKKKKKKKKEKEEEEE#EEWWEEEEEEEEEEEEEEEEEEEEEEEEEEEEKKKKKKKKKKKKKKKKKKKKKKKKW#WKKKKKKEEEGD:::.           .,;tfLGGDDDDDDDEDDDD *
	 *ti;.                                .:.,.                  LDEEEEKKKKKKKKKKWKWKKKKKKKKKKKKEEEKWEKW#EEEEEEEEEEEEEEEEKEEEEEEEEEEEEEEEKKKKKKKKKKKKKKKKKKKKW##KKKKKKEEEEf,,:.           .,;tfLGGDDDDDDDDEDDD *
	 *ti;.                               ..:.,.                 LGDEEEEKKKKKKKKKKWKKKKKKKKKKKKKKKKKWEEW#WEEEEEEEEEEEEEEEKEEEEEEEEEEEEEEEEEEEKEKKKKKKKKKKKKKKKK##KKKKKEEEEEfi;,.           .,;tfLGGDDDDDDDDDKDD *
	 *tt;.                                .:.,:                 jDEEEEKKKKKKKKKKWWKKKKKKKKKKKKKKKKKWKE#WWEEEEEEEEEEEEEEWEEEEEEEEEEEEEEEEEEEEEEEKKKKKKKKKKKKKKKKWWKKKKEEEEDfG;,:           .,;tfLGGDDDDDDDDDDKD *
	 *tii,.                               .:.,.                tGDEEEEKKKKKKKKKKWWWKKKKKKKKKKKKKKKWKKWWWKEEEEEEEEEEEEEKEEEEEEEEEEEEEEEEEEEEEEEEEEEEEKKKKKKKKKKKW#KKKKEEEEDGGi;,.          .,;tfLGGDDDDDDDDDDDE *
	 *ti;;,:.                             .:.,:                fDEEEEKKKKKKKKKKKWKKKKKKKKKKKKKKKKKWEK#WWKEEEEEEEEEEEEDEEEEEEEEEEEEEEGEEEEEEEEEEEEEEEEEEEKKKKKKKWWKKEEEEEEDDf;;;,.         .,;tfLGGDDDDDDDDDDDD *
	 *tii;,,:..                           ...,.               ;LEEEEEKKKKKKWKKKKWKKKKKKKKKKKKKKKKKEKKW#WEEEEEEEEEEEEEjEEEEEEEEEKEEEEGEEEEEEEEEKEEEEEEEEEEEEEEEEE#WKEEEEEEDDf;;;;,:        .,itfLGGDDDDDDDDDDDD *
	 *ti;,,,,,:.                          ...,.               LDEEEEKKKKKKKKKKKWWWKKKKKKKKKKKKKKKWKK#W#WEEEEEEEEEEEDDLEEEEEEEEEWEEEEDEEEEEEEEEKEEEEEEEEEEEEEEEEEWWEEEEEEEDDfj,,,,,:.      .,itfGGGDDDDDDDDDDDD *
	 *tii,,,,::::.                        ...,:              .fDEEEEKKKKKKWKKKKWWWKKKKKKKKKKKKKKKEKKW#WWEEEEEEEEEEEKiKEEKEEEEEEWEEEEDEEEEEEEEEEEEEEEEEEEEEEEEEEEWWEEEEEEEDDLD:::,,,:.     .,ijfGGGDDDDDDDDDDDD *
	 *ti;:::::::::..                      .:.,:              LDEEEEKKKKKKKWKKKKWWKKKKKKKKKKKKKKKKtKKWWWWKEEEEEEEEEDiiDEEEEEEEEWWEEEEEEDEEEEEEEEEEEEEEEEEEEEEEEEEEWKEEEEEDDDGL:. .:,,,:    .,ijLGGGDDDDDDDDDDDD *
	 *tt;. .::::::::..                    ...,:             :fDEEEKKKKKKKKKKKKWW#KKKKKKKKKKKKKKKKfKKWWWWKEEEEEEEEDti,DEKEEEEEEWWEEEDEEEEEEEEEKEEEEEEEEEEEEEDEEEEE#WEEEEEGGDGf:.  .:,;,:.  .,ijLGGDDDDDDDDDDDDD *
	 *tt;.   .:::::::..                   ...,:             GDEEEKKKKKKKKWKKKKWWWKKKWKKKKKKKWWWKDEKLWWWWKKEEEEEEDEi,LDEEEEEEEEWWEEEEEEEEEEEEEEEEEEEEEEEEEDEDEEEEEW#EEEEDDDDGf,.    :,,,:...,ijLGGGDDDDDDDDDDDD *
	 *tt;.    .....::::..                 ...,:             fDEEEKKKKKKKKWKKKKWWWWKKKWKKKKKKKKKKfWKiWWW#KKEEEEEEEi;.EDfEEEDEEiWWEEEEEEEEEEEEDGKEEEEEEEEEEDEEEEEEEWWEEEEDDDGGLi.     .,;,:::,ijLGGGDDDDDDDDDDDD *
	 *tt;.      ....:::::.                ...,.            iDEEEEKKKKKKKKWKKWKWWWWWKKWWWKKKKKKKKtWKt#WWWKKEEEEEDji..DDKDDEDEGiWKEEEEEEEEEEDDEjEEEEEEEEEEEDEEEEEEEKWKEEDDDDGGff.      .:,;,,;ijLGGGDDDDDDDDDDDD *
	 *tt;.        ....::::..              .:.,:           .LDEEEKKKKKKKKKKKKWWWWKWWWWWWWWWWKKKKWtKKiDWWWKKKEEEEKi:..DEDDDDDDiiWKEEEEEEEEEEDDEijDEEEEEKEEEEEEEEEEEEWWEEGDDDGGLG.       .:,;;iijLGGGDDDDDDDDDDDD *
	 *tt;.          .....:::..            ...,.           .fEEEEKKKKKKKKWKKKKWWWWWWWWWWWWWWKWKKKiKDiLWWWWKEEEEEi,..fD:DDDDDti;WEEEEEEEEEEKDDi:iDDEEEEWEEEEEEEEEEEE#WEEGDDDDGGG.         :,iitjLGGGDDDDDDDDDDDD *
	 *tti.            .....:::..          ...,.           GDEEEKKKKKKKKKWKKKWWW#WWWWWWWWWWWKWKKjiEjitWWWKKWEEEDi...DDLDDDDji;;WEEEEEEEEEEEDEj.iDDEEEEWEEEEEEEEEEEEWWEEDDDDDDGf.          .,;tjfLGGDDDDDDDDDDDD *
	 *tti.              ....::::..        ...,.           fEEEKKKKKKKKKKKKKKKW#WWWWWWWWWWWWWWWWtiEiiiWWWKKEWKEi....D.EDDDEi;.fWEEEEEEEEEEDDfL.;EDDEEEWEEEEEEEEEEEEWWEEEDDDDDGf.           :;ijfLGGDDDDDDDDDDDD *
	 *tti.                ....::::..      ...,.          LDEEEKKKKKKKKKKKKKKWWWWWWWWWWWWWWWW####WKiiiWWWKKKEEK,...:E:DDDEii..GWEEEEEEEEDWDDiL.,KDDEEEWEEEEEEEEEEEEWWKEEDDDDDGf:           .,itfLGGDDDDDDDDDDDD *
	 *tti.                 .....:::..     ...,.          fDEEEKKKKKKKKKWKKKKWWWWWWWWWWWWW########WLiiWWWKKKEEjD...G,DDDDi;...EWEEEEEEEEDKDEii..LDDEEEWEEEEEEEEEEEEWWWEEDDDDDGfi           .,;tfLGGGDDDDDDDDDDD *
	 *tti.                   .....:::..   ...,.         iGEEEKKKKKKKKKKWKKKKWWWWWWWWWWWW###########KiWWWKKEEE,.D..D.DDDii:...KKEEEEEEEEEDDj:...tEDEEEWEEEEEEEEEEEEWWWEEEDDDDDLL           .,;tjLLGGDDDDDDDDDDD *
	 *tti.                     ....::::......:.         LEEEKKKKKKKKKKWWKKKWWW#KWWWWWWWW#####W####W##KWWKKEEL..:D.jjDDi;,....KKEEEEEEEDfDDi...:iKDEEEWKEEEEEEEEEEEWWWEEEEDDDDLG           .,;tjLLGGDDDDDDDDDDD *
	 *tti.                        ...::::::..,.        :GEEEKKKKKKKKKKKKWWWWW##WWWWWWWWW##WKWK#W#W####WWKEEK.....G.DDti,.....KKEEEEEEDWGDf.,...iKDEEEWWEEEEEEEEEEEW#WEEEEEDDDGL           .,;tjLLGGDDDDDDDDDDD *
	 *tti.                         ....::::::,.        GDEEKKKKKKKKKKKKKWWWW###WWWWWWWWWW#WWWK###W#####WKEKK.....jDDL;;......KKEEEEEEEEEDi.f...;KDEEEWWEEEEEEEEEEEWWWWEEEEEDDGf           .,;tjLLGGDDDDDDDDDDD *
	 *tti.                           ....:::,,.       .LEEEKKKKKWKKKKKWWWWWW###WWWWWWWWWW#WWKW#WW##W#WWWKEKD:....:DD:;......;KEEEEEEEKiDD..f...,KKEEEWWEEEEEEEEEEEWWWWEEEEEDDDf           .:;tjLLGGGDDDDDDDDDD *
	 *tti.                             ...::,,,:.     GDEEKKKKKKKKKKKKWWWWWWW#WWWWWWWWWWW#KjKWWWWWWWWWWWWEK.j,..;fD.;.......fKEEEEEDKG:Di..,....DKEEEWWEEEEEEKEKKKWWWWEEEEEEDDf           .:;tjLLGGDDDDDDDDDDD *
	 *jti.                              ...::,,,,:.  .fEEEKKKKKWKKKKKKWWWWWWW#WWWWWWWWWWK#KKKWWWWWWWWWWWWWK..f:.:G.,:.......EKEEEEEKK;:E:.......fKEEEWWKEKEKKKKKKKW#WWEEEEEEDDf:          .,;tfLLGGDDDDDDDDDDD *
	 *tti.                               ...:,,,;;,: iDEEKKKKKWKKKKKKKWWWWWWW#WWWWWWWWWWK#WDKWWKKWWWWWWWWWE..;G:G..,........KKEEEEEKi.Gi..:.....tKEEKWWWKKKKKKKKKKW##WKEEEEEEDfi          .,;tfLLGGGDDDDDDDDDD *
	 *tti.                               ....::,,;;;,LEEKKKKKKWKKKKKWWWWWWW###WWWWWWWWWWKWWDKWEEEWKKWWWWWKKj.:LG..;.........EKEEEEKG;.G...;.....;KKEKWWWKKKKKKKKKKW##WWKEEEEEDfL          .,;tfLGGGDDDDDDDDDDD *
	 *jti.                                ...::::,;ijDEEKKKKKWKKKKKKWKWWWWW##WWWWWWWWWWWKK#KKGDGDWEEWKKWKKGE,.i;.:.........:EKEEEKE;.:L...j.....,KWEKWWWKKKKKKKKKK####WKKEEEEDLG          .,;tfLGGGGDDDDDDDDDD *
	 *jti.                                ...:...,,;GEEKKKKKWWKKKKKWWWWWWWW###WWWWWWWWWKKKWWKiLGGEDEDEKGKKiEG..;...........jKEEEKK;:.G....,.....:KKEWWWWKKKKKKKWKK####WKKKKEEEGL          .,;tfLGGGGDDDDDDDDDD *
	 *jti.                                ...:.  .:,GEEKKKKKWKKKKKWWWWWWWW####WWWWWWWWWKKKWWKii;fDLGDK: EEi:E:.............EKEEKK;;..L...........KKKWWWWKKKKKKKWKK####WKKKWKEEDf          .,;tfGGGGDDDDDDDDDDD *
	 *jti.                                ...:.    ,EEKKKKKWWKKKKKWWWWWWWWW###WWWWWWWWKKKKfWWLt;i,. fi  EG..D:.............EKEKK;;..t....:.......KWKWWWWKKKKKKKWKK####WKKKWEEEDf:.        .,;tfGGGGDDDDDDDDDDD *
	 *jti.                                ...:.    GEEKKKKKWKKKKKWWWWWWWWW####WWWWWWWKKKKKt;KKEfff     .;t.................KKKKi;:..GtGGfG.......KWWWWWWKKKKKKKWKK###WWWKKKKEEEf,,:       .,;tfGGGGDDDDDDDDDDD *
	 *jti.                                ...:.    GEKKKKKWWKKKKKWWWWWWWWWW##WWWWWWWKKKKKKt;EiKKKK,   ...t................jEKKG;;..,.....,LGi....KWWWWWWKKKKKKWKKKW####WKKKKKEEL,,,:.     .,;tfGGGDDDDDDDDDDDD *
	 *jti.                                ...:.  .GEEKKKKKWKKKKKWWWWWWWWWW###WWWWWWWKKKKKKtiE::tGG........................EEEj;;...,.........:D..DKWWWWWWKKKKK#KKW###W#WKKKKKEEfj:,,,:.   .,;tfGGGDDDDDDDDDDDD *
	 *jti.                                ...:.   DEKKKKKWWKKKKKWWWWWWWWW####WWWWWWWKKKKKKiiE:::.::.......................EEi;;...j.....f......:iDKWWWWWWKKKKK#WW######WKKKKKEELG :,,,,:. .,;tfGGGDDDDDDDDDDDD *
	 *jti.                                ...:.  fEEKKKKWWKKKKWWWWWWWWWWW###WWWWWWWWKKKKKK;tE::..........................DD;.;,.::......;........EWWWWWWWKKKKW#WW#####WWKKKWKKELG  .:,,,:::,;tfGGGDDDDDDDDDDDD *
	 *jti.                                ...:. .DEKEKKKWWKKKKWWWWWWWWWWW###WWWWWWWWKKKKKE,iD::..........................D..,;.,;tLffi...........DWDWWWW#KKKWWWWW#####W#KKKWKEEGL    .:,;,,,;tfGGGDDDDDDDDDDDD *
	 *jti.                                ...:. ;EEKKKKWWKKKKKWWWWWW#WWWW####WWWWWWKKKKKEL:iD:..........................j ..;..;;:.....i,........DKtWWWWWKKWWWWWW#####WWWKKKEKEDf     .:,;;;itfGGGDDDDDDDDDDDD *
	 *jti.                                ...:. DEKKKKKWWKKKKWWWWWWW#WWWW####WWWWWWKKKKKEj:iG...............................:....................GKiWWWWWKKWW#WWW######WWKKKKKEEf       .,;iitfGGGDDDDDDDDDDDD *
	 *jti.                                ...:.:EKKKKKWWKKKKKWWWWWWW#WWW#####WWWWWKWKKKKEi:if:.................................iEKEKKKKKKDj......DKiWWWWWKWK##WW#######WWKKK:KEEL        .:;itfGGGDDDDDDDDDDDD *
	 *jji.                                ...:,DEEKKKWWWKWKKWWWWWWWWWWWW#####WWWWWWWKKKKEi:it..................................j.  KKKKKKKKKKKf..DKiWWWWWKWW##WW#######WWKKK,KEEf         .,;tfGGGDDDDDDDDDDDD *
	 *jji.                                ..L:iDEEKKKWWKKKKKWWWWWWWWWWWW#####WWWWWKWKKKKKi.i;..................................  . KKKWWWWWWWWK..DGiWWWWWKK##WWW#####W#WWKKKjEKEL,        .:;tfGGGDDDDDDDDDDDD *
	 *jji.                               .f:::EEEKKKWWWKKKKKWWWWWWWWWWWW#####WWWWWKWKKKKK;.i,.................................::  KKEKWWWWWWfWK..EiiWWWWWKWW#WW##########KKKD,KELj        .:;tfGGDDDDDDDDDDDDD *
	 *jji.                             .t::::,DEEKKKWWKKKKWWWWWWWWW#WWWW#####WWWWKKWKKKEK;.i:.................................GDDEEEKKKWWWWWtWWD.E;iWWWWWW###WW#########WWKKK.EEDG        .:;tfGGGDDDDDDDDDDDD *
	 *jji.                          . j..::::EKEKKKWWWKKKKWWWWWWWWW#WWW######WWWWKKWKKKEK;.t:.................................ELLEDDEEEWWWWEtWK,.KiiWWWWWW###W##########WWKKK:EEEG     .;tjfLLGDDDDDDDDDDDDDDD *
	 *jji.                          i.::::::,EEEKKWWWKKKKKWWWWWWWWW#WWW#####WWWWWKWKKKKEE,.t..................................DfiEGDDDEEKKKttKWG.KiiWWWWW##WWW##########WWKKK:fEEL  ,fGGGDDDDDDDDEEEDDDDDDDDDD *
	 *jji.                        .;:..:::::DEEEKKWWWKKKKKWWWWWWWWW#WWWW####WWWWWWWKKKKED,.t..................................ifjDDGGEGDKK.ttKKE.DiWWWWW###WW##########WWWKKK:.KELiLGGGGDDDDDDDDDDDDEEEDDDDDDD *
	 *jji.                       i.:.::::::,KEEKKWWWKKKKKKWWWWWWWWW#WWWW####WWWWWWWKKKKEL:.j..................................GGf,;ifLLED .iiKKi:fWWWWWW##W#W##########WWWKKK:.KKLGGDDDDDDDDDDDDDDDDEDDEEDDDDD *
	 *jji.                     .j:.::::::::EEEKKKWWWKKKKKKWWWWWWWW##WWW#####WWWWWWWKKKKKf:.f..................................:EEfftf .,. ;iE,..jWWWWWWW###W############WWKKK,:KKGDDDDDDDDDDDDDDDDDDDDDDDEDDDD *
	 *jji.                    .:.::::::::,,EEEKKWWWKKKKKKKWWWWWWWW##WWW#####WWWWWWWKKKKKt..G....................................EEELL;   .j....tKWWWWWWW################WWWKKtfGKGEDDDDDDDDDDDDDDDDDDDDDDDEEDD *
	 *jji.                   :...:::::::,,jEEKKWWWWKKKKKKWWWWWWWWW##KWW#####KWWWWWWKKKKEi..D....................................:jEEE.........;KKWWWWWWWW#WW##W##########WWKKDLGKEKDDDDDDDDDDDDDDDDDDDDDDDDDED *
	 *jji.                  i:.::::::::,,,EEEKKWWWWKKKKKWWWWWWWWWW##WWW#####WWWWWWWKKKKKi..D......................................:::::......,KKKWWWWWWWWW#####W########WWWKKKGGKKEGGGGGGGGDDDDDDDDDDDDDDDDDDE *
	 *jji.                 i..:::::::::,,tEEKKWWWWKKKKKWWWWWWWWWWW##WW######WWWWWWWKKKKKi..D......................................::::......:EKKKWWWWWWWWWWW##WW########W#WKKWGGKKGGGGGGGGGGGGGGGDDDDDDDDDDDDD *
	 *jji.                .:::::::::::,,,EEEKKWWWWKKKKKWWWWWWWWWWW##WW#####WWWWWWWWKKKKKi..D....................................:::::::::..tELii;KWWWWWWWWWW##WW######WWWWWWKWGGGKGGGGGGGGGGGGGGGGGGGGGGGGGGDG *
	 *jjt.                :.::::::::,,,,fEEKKWWWWKKKKKKWWWWWWWWWW###WW####WWWWWWW#WKKKKKi..D....................................:::::::.:.,;;;;;;,KKWWWWWWWWW#WW########WWWKKWGGGKGGGGGGGGGGGGGGGGGGGGGGGGGGGG *
	 *jji.               ;.::::::::,,,,;EEEKWWWWWKKKKKWWWWWWWWWWWW##WW###WKWWWWWK#WKKKKKi..G......................................:::::::,;;;;:...KKKWWWWWWWWWKWW#######WWWWKKGLGKDGGGGGGLLGGGGGGGGGGGGGGGGGGG *
	 *jjt.              f.:::::::::,,,,fEEKKWWWWWKKKKKWWWWWWWWWWW###WW##WKKWWWWWW#WKKKKK;.jt........i.............................:::::::;j;;....:E.KKKWWWWWWWKWW#####W#WWWWKKLLGWEEGGGGGLGGGGGGGGGGGGGGGGGGGG *
	 *jjt.             ...:::::::,,,,,;DEEKWWWWWKKKKKWWWWWWWWWWWW####WWWKKKWWWWWWWWKKKKK;.E;.........t.............................:::::ii;;.....D...KKWWWWWWWKWW#####WWEWWWKKGGGEKKGGGGGLGGGGGGGGGGGGGLGGGGGG *
	 *fji.             ;.:::::::,,,,,;LEEKKWWWWWKKKKKWWWWWWWWWWWW####KWKKKKWWWWWWWWKKKKKi.D;..........j.............................:::tt;,.....:.....KKWWWWWWKWWWW##WWWGWWWKKGGGGKEGGGGGGGGGGGGGGGGGGGLLGGGGL *
	 *fji.            t::::::::,,,,,,;EEEKWWWWWKKKKKKKWWWWWWWWWWW##WKWKKKKKWWWWWWWWKKKKKi:D;............j...........................::LL;,.............KKWWWWWKWWWWWWWWWGWWWKKGGGGKGGGGGGGGGGGGGGGGGGGGLLGGGGL *
	 *fjt:            .:::::::,,,,,,,DEEKWWWWWWKKKKKKKWWWWWWWWWWWWKKWKKKKKKWWWWK#WWKKKKWitE;........... ............................:G;;:...............KKKWWKKWWWWWWWWWGWWWKKGGGGWGGGGGGGGGGGGGGGGGGGGGGGGGGL *
	 *fjji;:.       .f:::::::,,,,,,,;EEEKWWWWWWKKKKKKWWWWWWWWWWWKKKKKKKKKKKWWKWWWWWKKKKWGKD;........................................L;;..................DKKWKKWWWWWWWWWGWWWKKDGGGKDGGGGGGGGGGGGGGGGGGGGGGGGGG *
	 *fjjtii;,:.     :::::::,,,,,,,;EEEKWWWWWWKKKKKKWWWWWWWWWWKKKKKKKKKKKKWWWWWW#WWKKKKWiEj;......................................:i,;....,...............;KKEKWWWWWWWWWGKWWKKDDGGDEGGGDGGGGGDGGGGGGGGGGGGGGGG *
	 *fjtiiiii;;:.  j::::::,,,,,,,;;EEEKWWWWW#KKKKKWWWWWWWWWKKKKKKWKKKKKKKWWWWWWWWWKKKKWtEL;:....................................;;;:...,;j................:KEEWWWWWWWWWDDWWKKDDDDDKDDDDDDDDDDDDDDDGGGGGGGGGGG *
	 *fjti;;iiii;;,:::::::,,,,,,,,;EEEKWWWWWWWKKKKWWWWWWWWKKKKKKKWKKKKKKKWWWWWWW#W#KKKKWEEii;...................................f;:....,;L...................EEKWWWWWWWWDDWWKKDDDDDKEDDDDDDDDDDDDDDDDDDDDDGGGG *
	 *fjt,,,;;;;ii;f::::::,,,,,,,;;EEKWWWWWWWKKKKKWWWKWWKKKKKKKKKKKKKKKKKWWWWWWW#W#KKKKWKEij;:...............................:G;,.....,;f....................:tKKWWWWWWWDDWWKKDDDDDKKDDDDDDDDDDDDDDDDDDDDDDDDD *
	 *jjt. ..:,;;;;,::::,,,,,,,,;;GEEWWWWWWWWKKKKWKKWKKKKKKKKKKKKKKKKKKKKWWWWWWW#W#KKKKWEDi;j;............................,Li;L;;;..,;;f........................KKKKWWWKDDWWKKDDDGDKKGGGGGGGGDGDDDDDDDDDDDDDDD *
	 *fjt.    .:,,,:::::,,,,,,,;;;EEKWWWWWWWKKKKKKWKKKKKKKKKKKKKKKKKKKKKWKKKWKW##W#KKKKWEti;;G;........................tEEEL;;;;;;;;;;L..........................DKKKKKEDDWWKEDGftiLE;;;;itjLGGGGGGDDDDDDDDDDD *
	 *fjt.       .j::::,,,,,,,;;;DEEWWWWWWWWKKKKWKKKKKKKKKKKKKKKKKKKKKKKWKKWWWK##W#KKKKKEii;;;L;...................iDEEEEEEKKi;j;;;;jD.....:......................,KKKKDGGEKKE:::::;E::::::::::,tLGGDDDDDDDDDD *
	 *fjt.       .;:::,,,,,,,;;;;EEKWWWWWWWWKWKKKKKKKKKKKKKKKWKKKKKKKKKKWKKWWWW#WW#KKKKKKii;;;;f;.............:tDEEEEEKKKKKKKKEti;;;L...............................EEKf;:iKKE::::::E::::::::::::::ifDDDDDDDDD *
	 *fjt:        :::,,,,,,,,;;;DEEWWWWWWWWWEKKKKKKKKKKKKKKKKKKKKKKKKKKWWKKWWWW####KKKKKEiii;;;;f,.........iDEEEEKKKKKKKKKKKKKKKf;iG......i..........................fK::::KKE::::::E::::::::::::::::,tGGDDDDD *
	 *fjt:       t:::,,,,,,;;;;iDEKWWWWWWKEKKKKKKKKKKKKKKKKKKKKKKKKKKKKWWKKWWWW####WKKKKLiii;;;;;L,....,Li;EDEEEEKKKKKKKKKKKKKKKKiG......;:...........................:i:::KKE:::::,E,::::::::::::::::::iGDDDD *
	 *jjt.       f::,,,,,,,;;;;GEEWWWWKEEKEKKKKKKKKKKKKKKKKWKKKKKKKKKKKWWKWWWWW###WWKKKKiii;;;;;;;G,;L;;iiEEEEEEEKKKKKKKKKKKKKWWKE......;t.........:....................j::KEE:,::,,D,,::::,,,,,,:::::::::tDDD *
	 *fjt:.      ,::,,,,,,,;;;;EEWWKEEEEEEKKKKKKKKKKKKKKKKWKKKKKKKKKKKWWKKWWWWW#W#KKKKKKiiiiii;;;;;i;;iiiEEKEEKKWKKKKKKKWKKKKKWWWGi;...;t......,;;;;,....................:,EEE,,,,,,D,,,,,,,,,,,,,,,,::,::::tG *
	 *fjt:.     ,::,,,,,,,;;;;DEKEEEEEEEEKKKKKKKKKKKKKKKKKKKKKKKKKKKKKWWWWWWWWW#W#KKKKKKiiiii;;i;;;;;iiiKKKEKKKKWWKWWWWWWKKKKWWWWW;;;:;L.....;;;;;;;;;....................,KEE,,,,,,E,,,,,,,,,,,,,,,,,,,,,,,,; *
	 *fjt:.     f:,,,,,,,;;;;jEDEEEEEEEEEKKKKKKKKKKKKKKKKKKKKKKKKKKKKKWWWWWWWW#W##KKKKKKiiiiiiii;i;;iiiEKKKKKKKKWKWWWWWWWWKKKWWWWWKi;;i.....,jEEfGi;;;;;...................EED,,,,,,E,,,,,,,,,,,,,,,,,,,,,,,,, *
	 *fjt:.    .f::,,,,,,;;jEEDEEEEEEEEEEKKKKKKKKKKKKKKKWKKKKKKKKKKKKKWWWKWWWWW###KKKKKLiiiiiiiiiiiiiiEEKKKKKKKKWWWWWWWWWWWWKWWWWWWGi;i;,..;jDDDKEGi;;;;;;:................EED,,,,,,D,,,,,,,,,,,,,,,,,,,,,,,,, *
	 *fjt:.  .. ;::,,,,,;;EDDEEEEEEEEEEKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKWWKKW#WW####KWKKKiiiiiiiiiiiiijKKKKKKKKKKWWWWWWWWWWWWWWWWWWWWWt;i;;;;i;DDDDDDGi;;;;;;;;:.............EDf;,,,;,G;;;;;;;;;;;;;;;,,,,,,,,,, *
	 *fjt:......:,,,,,,;LDDDEEEEEEEEEEEKKKKKKKKKKKKKKKKWKKKKKKKKKKKKKWWWWKWWWW####KKKKKiiiiiiiiiiijKEKKWKKKKKKKWWWWWWWWWWWWWWWWWWWWWWiLiii;i;DEEEEDDE;i;;;;;;;;;:..........EDi,;;;;;L;;;;;;;;;;;;;;;;;;,,,,,,, *
	 *fjt:......:,,,,,;EDDDEEKEEEEEEEEEKKKKKKKKKKKKKKKWKKKKKKKKKKKKKKWWWWKKWWW##W#KWKKWEiiiiiijGKKKKKWWKKKKKKKKWWWWWWWWWWWWWWWWWWWWWWKi;iiiiDDEEEEEEDEi;;;;;;;;;;;;;,:.....ED;;;;;;;j;;;;;;;;;;;;;;;;;;;;;;;,, *
	 *fjt:.....t,,,,,;DDDDEEEKEEEEEEEEKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKWWWKKKWWWW##WKWKKWKiiiKKKKKKKKKWWKKKKKKKKWWWWWWWWWWWWWWW#WWWWWWWWWiiiiifLEEEEEEEEDi;i;;;;;;;;;;;;.....DD;;;;;;;i;;;;;;;;;;;;;;;;;;;;;;;;; *
	 *fjt:.....G,,,,,GDDDEEEEEEEEEEEEKKKKKKKKKKKKKKKKWKKKKKKKKKKKKKKKWWWKKKWWW###WKWKKWKitKKKKKKKKKWKKKKKKKKKKWWWWWWWWWWWWWW###WWWWWWWWEiiiiiiiEEEEEEEEDGiiii;;;;;;;;;.....GD;;;;;;;i;;;;;;;;;;;;;;;;;;;;;;;;; *
	 *fjt:.....L,,,,;GDDDEEEEEEEEEEKEKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKWWWWWDGWWW###KKWWKWKKKKKKKKKKKKKKKKKKKKKKKWWWWWWWWWWWWW####WWWWWWWWWiiiiiiiiEEEEEEEEEEDi;i;;;;;;;;.....Lj;;;;;;i;iiiiii;;;;;;ii;;;;;;;;;;; *
	 ***********************************************************************************************************************************************************************************************************/

	void sort(int a[]) {
		ArrayList<Integer> list=new ArrayList<>();
		for(int x: a) list.add(x);
		Collections.sort(list);
		for(int i=0;i<a.length;i++) a[i]=list.get(i);
	}
	void sort(long a[]) {
		ArrayList<Long> list=new ArrayList<>();
		for(long x: a) list.add(x);
		Collections.sort(list);
		for(int i=0;i<a.length;i++) a[i]=list.get(i);
	}
	void ruffleSort(int a[]) {
		Random rand=new Random();
		int n=a.length;
		for(int i=0;i<n;i++) {
			int j=rand.nextInt(n);
			int temp=a[i];
			a[i]=a[j];
			a[j]=temp;
		}
		Arrays.sort(a);
	}
	void ruffleSort(long a[]) {
		Random rand=new Random();
		int n=a.length;
		for(int i=0;i<n;i++) {
			int j=rand.nextInt(n);
			long temp=a[i];
			a[i]=a[j];
			a[j]=temp;
		}
		Arrays.sort(a);
	}

    static class FastReader {
        BufferedReader br;
        StringTokenizer st;
        public FastReader() {
            br = new BufferedReader(new InputStreamReader(System.in));
        }
        String next() {
            while (st==null || !st.hasMoreElements()) {
                try {
                    st = new StringTokenizer(br.readLine());
                }
                catch (IOException  e) {
                    e.printStackTrace();
                }
            }
            return st.nextToken();
        }
        int nextInt() {
            return Integer.parseInt(next());
        }
        long nextLong() {
            return Long.parseLong(next());
        }
        double nextDouble() {
            return Double.parseDouble(next());
        }
        String nextLine() {
            String s="";
            try {
                s=br.readLine();
            }
            catch (IOException e) {
                e.printStackTrace();
            }
            return s;
        }
    }

	long fact[];
	long invFact[];
	void init(int n) {
		fact=new long[n+1];
		invFact=new long[n+1];
		fact[0]=1;
		for(int i=1;i<=n;i++) {
			fact[i]=mul(i,fact[i-1]);
		}
		invFact[n]=power(fact[n],mod-2);
		for(int i=n-1;i>=0;i--) {
			invFact[i]=mul(invFact[i+1],i+1);
		}
	}

	long nCr(int n, int r) {
		if(n<r || r<0) return 0;
		return mul(fact[n],mul(invFact[r],invFact[n-r]));
	}

	long mul(long a, long b) {
		return a*b%mod;
	}
	long add(long a, long b) {
		return (a+b)%mod;
	}

	long power(long x, long y) {
		long gg=1;
		while(y>0) {
			if(y%2==1) gg=mul(gg,x);
			x=mul(x,x);
			y/=2;
		}
		return gg;
	}

    // Functions
	static long gcd(long a, long b) {
		return b==0?a:gcd(b,a%b);
	}
	static int gcd(int a, int b) {
		return b==0?a:gcd(b,a%b);
	}

	void print(int a[]) {
		int n=a.length;
		for(int i=0;i<n;i++) out.print(a[i]+" ");
	}

	void print(long a[]) {
		int n=a.length;
		for(int i=0;i<n;i++) out.print(a[i]+" ");
	}

    //Input Arrays
    static void input(long a[], int n) {
		for(int i=0;i<n;i++) {
			a[i]=inp.nextLong();
		}
	}
	static void input(int a[], int n) {
		for(int i=0;i<n;i++) {
			a[i]=inp.nextInt();
		}
	}
	static void input(String s[],int n) {
		for(int i=0;i<n;i++) {
			s[i]=inp.next();
		}
	}
	static void input(int a[][], int n, int m) {
		for(int i=0;i<n;i++) {
			for(int j=0;j<m;j++) {
				a[i][j]=inp.nextInt();
			}
		}
	}
	static void input(long a[][], int n, int m) {
		for(int i=0;i<n;i++) {
			for(int j=0;j<m;j++) {
				a[i][j]=inp.nextLong();
			}
		}
	}

}