President of Berland has a very vast office-room, where, apart from him, work his subordinates. Each subordinate, as well as President himself, has his own desk of a unique colour. Each desk is rectangular, and its sides are parallel to the office walls. One day President decided to establish an assembly, of which all his deputies will be members. Unfortunately, he does not remember the exact amount of his deputies, but he remembers that the desk of each his deputy is adjacent to his own desk, that is to say, the two desks (President's and each deputy's) have a common side of a positive length.

The office-room plan can be viewed as a matrix with n rows and m columns. Each cell of this matrix is either empty, or contains a part of a desk. An uppercase Latin letter stands for each desk colour. The «period» character («.») stands for an empty cell. 

Input

The first line contains two separated by a space integer numbers n, m (1 ≤ n, m ≤ 100) — the length and the width of the office-room, and c character — the President's desk colour. The following n lines contain m characters each — the office-room description. It is guaranteed that the colour of each desk is unique, and each desk represents a continuous subrectangle of the given matrix. All colours are marked by uppercase Latin letters.

Output

Print the only number — the amount of President's deputies.

Examples

Input

3 4 R
G.B.
.RR.
TTT.


Output

2


Input

3 3 Z
...
.H.
..Z


Output

0
import java.io.*;
import java.lang.management.GarbageCollectorMXBean;
import java.lang.management.ManagementFactory;
import java.util.*;

import static java.lang.Math.sqrt;

public class PresidentsOffice {
    /*
    * 3        4       R
    G.B.
    .RR.
    TTT.*/
    public void run() throws Exception {

        String[] line = nextLine().split(" ");
        int length = Integer.parseInt(line[0]);
        int width = Integer.parseInt(line[1]);
        String presidentColor = line[2];
        String[][] array = new String[length][width];
        String indexes = "";
        for (int i = 0; i < length; i++) {
            String insideArray = nextLine();
            for (int j = 0; j < insideArray.split("").length; j++) {
                if (insideArray.split("")[j].equals(presidentColor)) {
                    indexes += "," + i + " " + j;
                }
                array[i][j] = insideArray.split("")[j];
            }
        }
        String[] arrayOfIndexes = indexes.split(",");
        Set<String> neighbours = new HashSet<>();
        for (int i = 0; i < arrayOfIndexes.length; i++) {
            String index = arrayOfIndexes[i].trim();
            if (!index.isEmpty()) {
                int indexI = Integer.parseInt(index.split(" ")[0]);
                int indexJ = Integer.parseInt(index.split(" ")[1]);
                addingNeighboursToSet(array, indexI, indexJ, neighbours);

            }
        }
        System.out.println(neighbours.stream().filter(element -> !(element.equals(".") || element.equals(presidentColor))).count());
    }

    private void addingNeighboursToSet(String[][] array, int indexI, int indexJ, Set<String> neighbours) {
       int origninalI= indexI;
       int originialJ =indexJ;

        int left = --indexJ;
        int right = indexJ + 2;
        int up = --indexI;
        int down = indexI + 2;


        if (left >= 0) {
            neighbours.add(array[origninalI][left]);
        }
        if (up >= 0) {
            neighbours.add(array[up][originialJ]);
        }

        if (down < array.length)
            neighbours.add(array[down][originialJ]);

        if (right < array[0].length)
            neighbours.add(array[origninalI][right]);

    }

    public static void main(String... args) throws Exception {
        br = new BufferedReader(new InputStreamReader(System.in));
        pw = new PrintWriter(new BufferedOutputStream(System.out));
        new PresidentsOffice().run();
        br.close();
        pw.close();
        System.err.println("\n[Time : " + (System.currentTimeMillis() - startTime) + " ms]");
        long gct = 0, gcc = 0;
        for (GarbageCollectorMXBean garbageCollectorMXBean : ManagementFactory.getGarbageCollectorMXBeans()) {
            gct += garbageCollectorMXBean.getCollectionTime();
            gcc += garbageCollectorMXBean.getCollectionCount();
        }
        System.err.println("[GC time : " + gct + " ms, count = " + gcc + "]");
    }

    static long startTime = System.currentTimeMillis();
    static BufferedReader br;
    static PrintWriter pw;
    StringTokenizer stok;

    String nextToken() throws IOException {
        while (stok == null || !stok.hasMoreTokens()) {
            String s = br.readLine();
            if (s == null) {
                return null;
            }
            stok = new StringTokenizer(s);
        }
        return stok.nextToken();
    }

    void print(byte b) {
        print("" + b);
    }

    void print(int i) {
        print("" + i);
    }

    void print(long l) {
        print("" + l);
    }

    void print(double d) {
        print("" + d);
    }

    void print(char c) {
        print("" + c);
    }

    void print(Object o) {
        if (o instanceof int[]) {
            print(Arrays.toString((int[]) o));
        } else if (o instanceof long[]) {
            print(Arrays.toString((long[]) o));
        } else if (o instanceof char[]) {
            print(Arrays.toString((char[]) o));
        } else if (o instanceof byte[]) {
            print(Arrays.toString((byte[]) o));
        } else if (o instanceof short[]) {
            print(Arrays.toString((short[]) o));
        } else if (o instanceof boolean[]) {
            print(Arrays.toString((boolean[]) o));
        } else if (o instanceof float[]) {
            print(Arrays.toString((float[]) o));
        } else if (o instanceof double[]) {
            print(Arrays.toString((double[]) o));
        } else if (o instanceof Object[]) {
            print(Arrays.toString((Object[]) o));
        } else {
            print("" + o);
        }
    }

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

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

    void print(String s) {
        pw.print(s);
    }

    void println() {
        println("");
    }

    void println(byte b) {
        println("" + b);
    }

    void println(int i) {
        println("" + i);
    }

    void println(long l) {
        println("" + l);
    }

    void println(double d) {
        println("" + d);
    }

    void println(char c) {
        println("" + c);
    }

    void println(Object o) {
        print(o);
        println();
    }

    void println(String s) {
        pw.println(s);
    }

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

    long nextLong() throws IOException {
        return Long.parseLong(nextToken());
    }

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

    char nextChar() throws IOException {
        return (char) (br.read());
    }

    String next() throws IOException {
        return nextToken();
    }

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

    int[] readInt(int size) throws IOException {
        int[] array = new int[size];
        for (int i = 0; i < size; i++) {
            array[i] = nextInt();
        }
        return array;
    }

    long[] readLong(int size) throws IOException {
        long[] array = new long[size];
        for (int i = 0; i < size; i++) {
            array[i] = nextLong();
        }
        return array;
    }

    double[] readDouble(int size) throws IOException {
        double[] array = new double[size];
        for (int i = 0; i < size; i++) {
            array[i] = nextDouble();
        }
        return array;
    }

    String[] readLines(int size) throws IOException {
        String[] array = new String[size];
        for (int i = 0; i < size; i++) {
            array[i] = nextLine();
        }
        return array;
    }

    int gcd(int a, int b) {
        if (a == 0)
            return Math.abs(b);
        if (b == 0)
            return Math.abs(a);
        a = Math.abs(a);
        b = Math.abs(b);
        int az = Integer.numberOfTrailingZeros(a), bz = Integer.numberOfTrailingZeros(b);
        a >>>= az;
        b >>>= bz;
        while (a != b) {
            if (a > b) {
                a -= b;
                a >>>= Integer.numberOfTrailingZeros(a);
            } else {
                b -= a;
                b >>>= Integer.numberOfTrailingZeros(b);
            }
        }
        return (a << Math.min(az, bz));
    }

    long gcd(long a, long b) {
        if (a == 0)
            return Math.abs(b);
        if (b == 0)
            return Math.abs(a);
        a = Math.abs(a);
        b = Math.abs(b);
        int az = Long.numberOfTrailingZeros(a), bz = Long.numberOfTrailingZeros(b);
        a >>>= az;
        b >>>= bz;
        while (a != b) {
            if (a > b) {
                a -= b;
                a >>>= Long.numberOfTrailingZeros(a);
            } else {
                b -= a;
                b >>>= Long.numberOfTrailingZeros(b);
            }
        }
        return (a << Math.min(az, bz));
    }

    boolean isPrime(int v) {
        if (v <= 1) {
            return false;
        }
        if (v <= 3) {
            return true;
        }
        if (((v & 1) == 0) || ((v % 3) == 0)) {
            return false;
        }
        for (int m = 5, n = (int) sqrt(v); m <= n; m += 6) {
            if (((v % m) == 0) || ((v % (m + 2)) == 0)) {
                return false;
            }
        }
        return true;
    }

    void rshuffle(int[] a) { // RANDOM shuffle
        Random r = new Random();
        for (int i = a.length - 1, j, t; i >= 0; j = r.nextInt(a.length), t = a[i], a[i] = a[j], a[j] = t, i--)
            ;
    }

    void qshuffle(int[] a) { // QUICK shuffle
        int m = new Random().nextInt(10) + 2;
        for (int i = 0, n = a.length, j = m % n, t; i < n; t = a[i], a[i] = a[j], a[j] = t, i++, j = (i * m) % n)
            ;
    }

    void shuffle(long[] a) {
        Random r = new Random();
        for (int i = a.length - 1; i >= 0; i--) {
            int j = r.nextInt(a.length);
            long t = a[i];
            a[i] = a[j];
            a[j] = t;
        }
    }

    void shuffle(Object[] a) {
        Random r = new Random();
        for (int i = a.length - 1; i >= 0; i--) {
            int j = r.nextInt(a.length);
            Object t = a[i];
            a[i] = a[j];
            a[j] = t;
        }
    }

    int[] sort(int[] a) {
        final int SHIFT = 16, MASK = (1 << SHIFT) - 1, SIZE = (1 << SHIFT) + 1;
        int n = a.length, ta[] = new int[n], ai[] = new int[SIZE];
        for (int i = 0; i < n; ai[(a[i] & MASK) + 1]++, i++)
            ;
        for (int i = 1; i < SIZE; ai[i] += ai[i - 1], i++)
            ;
        for (int i = 0; i < n; ta[ai[a[i] & MASK]++] = a[i], i++)
            ;
        int[] t = a;
        a = ta;
        ta = t;
        ai = new int[SIZE];
        for (int i = 0; i < n; ai[(a[i] >> SHIFT) + 1]++, i++)
            ;
        for (int i = 1; i < SIZE; ai[i] += ai[i - 1], i++)
            ;
        for (int i = 0; i < n; ta[ai[a[i] >> SHIFT]++] = a[i], i++)
            ;
        return ta;
    }

    void flush() {
        pw.flush();
    }

    void pause() {
        flush();
        System.console().readLine();
    }

}
