C# 100%
public class Solution {\n    \n    private bool CanCommunicate(int[][] languages, int a, int b)\n    {\n        var languagesA = languages[a-1];\n        var la
public class Solution {\n    \n    private bool CanCommunicate(int[][] languages, int a, int b)\n    {\n        var languagesA = languages[a-1];\n        var languagesB = languages[b-1];\n        \n        int i=0;\n        int j=0;\n        while(i<languagesA.Length && j<languagesB.Length)\n        {\n            if(languagesA[i]==languagesB[j])\n            {\n                return true;\n            }\n            else if(languagesA[i]<languagesB[j])\n            {\n                i++;\n            }\n            else\n            {\n                j++;\n            }\n        }\n            return false;\n    }\n    \n    public int MinimumTeachings(int n, int[][] languages, int[][] friendships) {\n        \n\t\tvar disConnectedUsers = new HashSet<int>();\n        foreach(var language in languages)\n        {\n            Array.Sort(language);\n        }\n        \n        for(int i=0; i<friendships.Length; i++)\n        {\n            if(!CanCommunicate(languages, friendships[i][0], friendships[i][1]))\n            {\n                disConnectedUsers.Add(friendships[i][0]);\n                disConnectedUsers.Add(friendships[i][1]);\n            }\n        }\n\t\t\n        var freq = new int[n];\n        int max=0;\n        foreach(var user in disConnectedUsers)\n        {\n            foreach(var language in languages[user-1])\n            {\n                freq[language-1]++;\n                max = Math.Max(freq[language-1],max);\n            }\n        }\n        \n        return disConnectedUsers.Count()-max;\n    }\n}
[]