public static void main(String[] args) {

        //Validate input arguments
        final PeakTrafficResult validationResult = validateInput(args);
        if (validationResult != PeakTrafficResult.OK) {
            Log.error(validationResult.getMessage());
            System.exit(validationResult.getReturnCode());
        }
        final File sourceFile = new File(args[0]);

        //Create the Data provider which will parse the the file into valid data
        FileDataProvider provider = new FaceBookDataProvider(sourceFile.getPath());
        final List<FacebookDataImpl> allData = provider.getAllData();

        //Create an empty graph and add the connections described by the data
        final NoEdgeInfoGraph<String> g = new NoEdgeInfoGraph<String>();
        for (FacebookDataImpl d : allData) {
            g.addConnection(d.getSourceUser(), d.getTargetUser());

        }

        //At this point we have a biDirectional graph. Remove all the vertex connections which are not bidirectional,
        //converting the graph to uniDirectional. This is compulsorz for current impl.
        g.removeNonBidirectionalConnections();

        Log.debug(g.toString());

        //Find all maximal cliques on the graph
        BronKerboschCliqueFinder<String, String> finder = new BronKerboschCliqueFinder<String, String>(g);
        final Collection<Set<String>> result = finder.getAllMaximalCliques();

        //Sort the retrieved result and print them
        final List<List<String>> sortedResult = sortClusters(result);
        for (List<String> set : sortedResult) {
            if (set.size() >= SET_SIZE_THRESHOLD) {
                System.out.println(prettyPrint(set));
            } else {
                Log.debug("Got cluster \'" + prettyPrint(set) + "\', but did not reach the minimum length");
            }
        }
    }