Codehorses has just hosted the second Codehorses Cup. This year, the same as the previous one, organizers are giving T-shirts for the winners.

The valid sizes of T-shirts are either "M" or from 0 to 3 "X" followed by "S" or "L". For example, sizes "M", "XXS", "L", "XXXL" are valid and "XM", "Z", "XXXXL" are not.

There are n winners to the cup for both the previous year and the current year. Ksenia has a list with the T-shirt sizes printed for the last year cup and is yet to send the new list to the printing office. 

Organizers want to distribute the prizes as soon as possible, so now Ksenia is required not to write the whole list from the scratch but just make some changes to the list of the previous year. In one second she can choose arbitrary position in any word and replace its character with some uppercase Latin letter. Ksenia can't remove or add letters in any of the words.

What is the minimal number of seconds Ksenia is required to spend to change the last year list to the current one?

The lists are unordered. That means, two lists are considered equal if and only if the number of occurrences of any string is the same in both lists.

Input

The first line contains one integer n (1 ≤ n ≤ 100) — the number of T-shirts.

The i-th of the next n lines contains a_i — the size of the i-th T-shirt of the list for the previous year.

The i-th of the next n lines contains b_i — the size of the i-th T-shirt of the list for the current year.

It is guaranteed that all the sizes in the input are valid. It is also guaranteed that Ksenia can produce list b from the list a.

Output

Print the minimal number of seconds Ksenia is required to spend to change the last year list to the current one. If the lists are already equal, print 0.

Examples

Input

3
XS
XS
M
XL
S
XS


Output

2


Input

2
XXXL
XXL
XXL
XXXS


Output

1


Input

2
M
XS
XS
M


Output

0

Note

In the first example Ksenia can replace "M" with "S" and "S" in one of the occurrences of "XS" with "L".

In the second example Ksenia should replace "L" in "XXXL" with "S".

In the third example lists are equal.
//package com.swiggy.dijkstra;

import com.sun.org.apache.bcel.internal.generic.ARRAYLENGTH;

import java.awt.event.TextEvent;
import java.io.*;
import java.util.*;

public class ModifyLongest {
    InputStream is;
    PrintWriter out;
    String INPUT = "";
    //boolean codechef=true;
    boolean codechef=true;


    void solve()
    {
        int n=ni();
        String[] a=new String[n];
        String[] b=new String[n];
        int[][] cnta=new int[4][3];
        int[][] cntb=new int[4][3];
        for(int i=0;i<n;i++)
        {
            a[i]=ns();
            int len=a[i].length();
            if(a[i].charAt(len-1)=='S')
            {
                cnta[len-1][0]++;
            }
            else if(a[i].charAt(len-1)=='M')
            {
                cnta[len-1][1]++;
            }
            else
            {
                cnta[len-1][2]++;
            }
        }
        for(int i=0;i<n;i++)
        {
            b[i]=ns();
            int len=b[i].length();
            if(b[i].charAt(len-1)=='S')
            {
                cntb[len-1][0]++;
            }
            else if(b[i].charAt(len-1)=='M')
            {
                cntb[len-1][1]++;
            }
            else
            {
                cntb[len-1][2]++;
            }
        }
        int ans=0;
        for(int i=0;i<4;i++)
        {
            for(int j=0;j<3;j++)
            {
                if(cnta[i][j]>cntb[i][j])ans+=cnta[i][j]-cntb[i][j];
            }
        }
        System.out.println(ans);
    }

    static int ans;

    static int comp(int u,boolean[] vis,Edge[][] g)
    {
        vis[u]=true;
        int sum=0;
        for(Edge ed:g[u])
        {
            int end=ed.end;
            if(!vis[end])
            {
                int val=comp(ed.end,vis,g);
                if(val%2==0)
                {
                    ans++;
                }
                else sum+=val;
            }
        }
        return sum+1;
    }


    static class Edge
    {
        int end;
        int odd;
        int sum;
    }


    static int[][] packD(int[] from,int[] to,int n)
    {
        int len=from.length;
        int[] cnt=new int[n];
        for(int i=0;i<len;i++)
        {
            cnt[from[i]]++;
        }
        int[][] graph=new int[n][];
        for(int i=0;i<n;i++)
        {
            graph[i]=new int[cnt[i]];
        }
        int[] ind=new int[n];
        for(int i=0;i<len;i++)
        {
            graph[from[i]][ind[from[i]]++]=to[i];
        }
        return graph;
    }



    static class Temp
    {
        int ind;
        int val;

        public Temp(int ind,int val)
        {
            this.ind=ind;
            this.val=val;
        }

    }

    static HashMap<Integer,Integer> map;

    static void rev(char[] arr,int st,int end)
    {
        int len=(end-st+1);
        for(int i=st;i<st+len/2;i++)
        {
            char tmp=arr[i];
            arr[i]=arr[end];
            arr[end]=tmp;
            end--;
        }
    }

    static long fnc(int a,int b)
    {
        long val=Math.min(a,b)*1000000007;
        val+=Math.max(a,b);
        return val;
    }

    static long fnc2(int a,int b)
    {
        long val=a*1000000007;
        val+=b;
        return val;
    }

    static class Pair
    {
        int a,b;
        public Pair(int a,int b)
        {
            this.a=a;
            this.b=b;
        }
    }

    static int bit[];

    static void add(int x,int d,int n)
    {
        for(int i=x;i<=n;i+=i&-i)bit[i]+=d;
    }

    static int query(int x)
    {
        int ret=0;
        for(int i=x;i>0;i-=i&-i)
            ret+=bit[i];
        return ret;
    }

    static long lcm(int a,int b)
    {
        long val=a;
        val*=b;
        return (val/gcd(a,b));
    }

    static int gcd(int a,int b)
    {
        if(a==0)return b;
        return gcd(b%a,a);
    }

    static int pow(int a, int b, int p)
    {
        long ans = 1, base = a;
        while (b!=0)
        {
            if ((b & 1)!=0)
            {
                ans *= base;
                ans%= p;
            }
            base *= base;
            base%= p;
            b >>= 1;
        }
        return (int)ans;
    }

    static int inv(int x, int p)
    {
        return pow(x, p - 2, p);
    }


    void run() throws Exception
    {
        if(codechef)oj=true;
        is = oj ? System.in : new ByteArrayInputStream(INPUT.getBytes());
        out = new PrintWriter(System.out);

        long s = System.currentTimeMillis();
        solve();
        out.flush();
        tr(System.currentTimeMillis()-s+"ms");
    }

    public static void main(String[] args) throws Exception {new ModifyLongest().run();}

    private byte[] inbuf = new byte[1024];
    public int lenbuf = 0, ptrbuf = 0;

    private int readByte()
    {
        if(lenbuf == -1)throw new InputMismatchException();
        if(ptrbuf >= lenbuf){
            ptrbuf = 0;
            try { lenbuf = is.read(inbuf); } catch (IOException e) { throw new InputMismatchException(); }
            if(lenbuf <= 0)return -1;
        }
        return inbuf[ptrbuf++];
    }

    private boolean isSpaceChar(int c) { return !(c >= 33 && c <= 126); }
    private int skip() { int b; while((b = readByte()) != -1 && isSpaceChar(b)); return b; }

    private double nd() { return Double.parseDouble(ns()); }
    private char nc() { return (char)skip(); }

    private String ns()
    {
        int b = skip();
        StringBuilder sb = new StringBuilder();
        while(!(isSpaceChar(b))){ // when nextLine, (isSpaceChar(b) && b != ' ')
            sb.appendCodePoint(b);
            b = readByte();
        }
        return sb.toString();
    }

    private char[] ns(int n)
    {
        char[] buf = new char[n];
        int b = skip(), p = 0;
        while(p < n && !(isSpaceChar(b))){
            buf[p++] = (char)b;
            b = readByte();
        }
        return n == p ? buf : Arrays.copyOf(buf, p);
    }

    private char[][] nm(int n, int m)
    {
        char[][] map = new char[n][];
        for(int i = 0;i < n;i++)map[i] = ns(m);
        return map;
    }

    private int[] na(int n)
    {
        int[] a = new int[n];
        for(int i = 0;i < n;i++)a[i] = ni();
        return a;
    }

    private int ni()
    {
        int num = 0, b;
        boolean minus = false;
        while((b = readByte()) != -1 && !((b >= '0' && b <= '9') || b == '-'));
        if(b == '-'){
            minus = true;
            b = readByte();
        }

        while(true){
            if(b >= '0' && b <= '9'){
                num = num * 10 + (b - '0');
            }else{
                return minus ? -num : num;
            }
            b = readByte();
        }
    }

    private long nl()
    {
        long num = 0;
        int b;
        boolean minus = false;
        while((b = readByte()) != -1 && !((b >= '0' && b <= '9') || b == '-'));
        if(b == '-'){
            minus = true;
            b = readByte();
        }

        while(true){
            if(b >= '0' && b <= '9'){
                num = num * 10 + (b - '0');
            }else{
                return minus ? -num : num;
            }
            b = readByte();
        }
    }

    private boolean oj = System.getProperty("ONLINE_JUDGE") != null;
    private void tr(Object... o) { if(!oj)System.out.println(Arrays.deepToString(o)); }
}