protected List<List<Talk>> getScheduleConferenceTrack(List<Talk> talksList) throws Exception {
        // Find the total possible days.
        int perDayMinTime = 6 * 60;
        int totalTalksTime = getTotalTalksTime(talksList);
        int totalPossibleDays = totalTalksTime/perDayMinTime;
        // Sort the talkList.
        List<Talk> talksListForOperation = new ArrayList<Talk>();
        talksListForOperation.addAll(talksList);
        Collections.sort(talksListForOperation);
        // Find possible combinations for the morning session.
        List<List<Talk>> morningSessions = findPossibleCombSession(talksListForOperation, totalPossibleDays, true);
        // Remove all the scheduled talks for morning session, from the operationList.
        for(List<Talk> talkList : morningSessions) {
            talksListForOperation.removeAll(talkList);
        }
        // Find possible combinations for the evening session.
        List<List<Talk>> eveningSessions = findPossibleCombSession(talksListForOperation, totalPossibleDays, false);
        // Remove all the scheduled talks for evening session, from the operationList.
        for(List<Talk> talkList : eveningSessions) {
            talksListForOperation.removeAll(talkList);
        }
        // check if the operation list is not empty, then try to fill all the remaining talks in evening session.
        int maxSessionTimeLimit = 240;
        if(!talksListForOperation.isEmpty()) {
            List<Talk> scheduledTalkList = new ArrayList<Talk>();
            for(List<Talk> talkList : eveningSessions) {
                int totalTime = getTotalTalksTime(talkList);

                for(Talk talk : talksListForOperation) {
                    int talkTime = talk.getTimeDuration();

                    if(talkTime + totalTime <= maxSessionTimeLimit) {
                        talkList.add(talk);
                        talk.setScheduled(true);
                        scheduledTalkList.add(talk);
                    }
                }

                talksListForOperation.removeAll(scheduledTalkList);
                if(talksListForOperation.isEmpty())
                    break;
            }
        }
        // If operation list is still not empty, its mean the conference can not be scheduled with the provided data.
        if(!talksListForOperation.isEmpty()) {
            throw new Exception("Unable to schedule all task for the conference.");
        }
        // Schedule the day event from morning session and evening session.
        return getScheduledTalksList(morningSessions, eveningSessions);
    }