using System;
using System.Collections.Generic;
using System.Linq;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            var log = new FrienshipRecord[] {
                new FrienshipRecord() { Time = 0, Member1 = "a", Member2 = "b" },
                new FrienshipRecord() { Time = 1, Member1 = "c", Member2 = "d" },
                new FrienshipRecord() { Time = 2, Member1 = "d", Member2 = "e" },
                new FrienshipRecord() { Time = 3, Member1 = "f", Member2 = "e" },
                new FrienshipRecord() { Time = 4, Member1 = "a", Member2 = "f" },
                new FrienshipRecord() { Time = 5, Member1 = "c", Member2 = "a" },
            };

            var socialNetwork = new List<HashSet<string>>();

            int totalMembersCount = 6;

            foreach (var record in log)
            {
                var group1 = socialNetwork.FirstOrDefault(g => g.Contains(record.Member1));
                var group2 = socialNetwork.FirstOrDefault(g => g.Contains(record.Member2));

                switch (group1 is null, group2 is null)
                {
                    case (false, false) when group1 == group2:
                        // do nothing
                        break;
                    case (false, false) when group1 != group2:
                        MergeGroups(socialNetwork, group1, group2); 
                        break;
                    case (false, true):
                        group1.Add(record.Member2);
                        break;
                    case (true, false):
                        group2.Add(record.Member1);
                        break;
                    case (true, true):
                        socialNetwork.Add(new HashSet<string>() { record.Member1, record.Member2 });
                        break;
                }

                // If the social network contains only one group
                // and also the grop contains all the members
                if (socialNetwork.Count == 1 && socialNetwork[0].Count == totalMembersCount)
                {
                    Console.WriteLine("All members were friends at " + record.Time);
                    return;
                }
            }

            Console.WriteLine("Not all of the members are friends yet");
        }

        private static void MergeGroups(
            List<HashSet<string>> socialNetwork,
            HashSet<string> group1,
            HashSet<string> group2)
        {
            if (group1.Count > group2.Count)
            {
                group1.UnionWith(group2);
                socialNetwork.Remove(group2);
            }
            else
            {
                group2.UnionWith(group1);
                socialNetwork.Remove(group1);
            }
        }
    }

    internal struct FrienshipRecord
    {
        internal int Time;
        internal string Member1;
        internal string Member2;
    }
}