Problem: Asterix, Obelix and their temporary buddies Suffix and Prefix has finally found the Harmony temple. However, its doors were firmly locked and even Obelix had no luck opening them.

A little later they found a string s, carved on a rock below the temple's gates. Asterix supposed that that's the password that opens the temple and read the string aloud. However, nothing happened. Then Asterix supposed that a password is some substring t of the string s.

Prefix supposed that the substring t is the beginning of the string s; Suffix supposed that the substring t should be the end of the string s; and Obelix supposed that t should be located somewhere inside the string s, that is, t is neither its beginning, nor its end.

Asterix chose the substring t so as to please all his companions. Besides, from all acceptable variants Asterix chose the longest one (as Asterix loves long strings). When Asterix read the substring t aloud, the temple doors opened. 

You know the string s. Find the substring t or determine that such substring does not exist and all that's been written above is just a nice legend.

Input

You are given the string s whose length can vary from 1 to 106 (inclusive), consisting of small Latin letters.

Output

Print the string t. If a suitable t string does not exist, then print "Just a legend" without the quotes.

Examples

Input

fixprefixsuffix


Output

fix

Input

abcdabc


Output

Just a legend

Solution (in JAVA):

Solution:
import java.io.*;
import java.util.*;
import java.math.*;

import static java.lang.Math.*;

public class Main implements Runnable {

    StreamTokenizer in;
    BufferedReader reader;
    PrintWriter out;
    StringTokenizer tok;
    Scanner sc;
    boolean timus = true;// System.getProperty("ONLINE_JUDGE")!=null;
    boolean codeforces = true;
    final double eps = 1e-9;

    public static void main(String[] args) throws Exception {
        new Thread(new Main()).start();
    }

    @Override
    public void run() {
        try {
            if (codeforces) {
                sc = new Scanner(System.in);
                reader = new BufferedReader(new InputStreamReader(System.in));
                in = new StreamTokenizer(reader);
                out = new PrintWriter(new OutputStreamWriter(System.out));
                tok = new StringTokenizer("");
                solve();
                out.flush();
            } else if (timus) {
                // sc = new Scanner("input.txt");
                reader = new BufferedReader(new FileReader("input.txt"));
                in = new StreamTokenizer(reader);
                out = new PrintWriter(new FileWriter("output.txt"));
                tok = new StringTokenizer("");
                solve();
                out.flush();
                out.close();
            } else if (!timus) {
                long begMem = Runtime.getRuntime().totalMemory()
                        - Runtime.getRuntime().freeMemory();
                long t1 = System.currentTimeMillis();
                reader = new BufferedReader(new InputStreamReader(System.in));
                in = new StreamTokenizer(reader);
                sc = new Scanner(System.in);
                out = new PrintWriter(new OutputStreamWriter(System.out));
                tok = new StringTokenizer("");
                solve();
                long endMem = Runtime.getRuntime().totalMemory()
                        - Runtime.getRuntime().freeMemory();
                out.flush();
                long t2 = System.currentTimeMillis();
                System.out.println("Time:" + (t2 - t1));
                System.out.println("Memory:" + (endMem - begMem));
                System.out.println("Total memory: "
                        + (Runtime.getRuntime().totalMemory() - Runtime
                                .getRuntime().freeMemory()));
            }
        } catch (Exception ex) {
            System.out.println("fail");
            System.exit(1);
        }
    }

    public class Chess {
        String coord;

        public Chess(String s) {
            this.coord = s;
        }

        public int toInteger(char s) {
            if (s == 'a' || s == 'A')
                return 1;
            else if (s == 'b' || s == 'B')
                return 2;
            else if (s == 'c' || s == 'C')
                return 3;
            else if (s == 'd' || s == 'D')
                return 4;
            else if (s == 'e' || s == 'E')
                return 5;
            else if (s == 'f' || s == 'F')
                return 6;
            else if (s == 'g' || s == 'G')
                return 7;
            else if (s == 'h' || s == 'H')
                return 8;
            else
                return -1;
        }

        public String toString(int s) {
            if (s == 1)
                return "a";
            else if (s == 2)
                return "b";
            else if (s == 3)
                return "c";
            else if (s == 4)
                return "d";
            else if (s == 5)
                return "e";
            else if (s == 6)
                return "f";
            else if (s == 7)
                return "g";
            else if (s == 8)
                return "h";
            else
                return "0";
        }

        public pair getPair() {
            String j = "";
            j += coord.charAt(1);
            pair p = new pair(toInteger(coord.charAt(0)), Integer.parseInt(j));
            if (p.x != -1)
                return p;
            else
                return new pair(0, 0);
        }

        public String returnPair(pair p) {
            return toString(p.x) + p.y;
        }
    }

    public int nextInt() throws Exception {
        in.nextToken();
        return (int) in.nval;
    }

    public String next() throws Exception {
        in.nextToken();
        return in.sval;
    }

    public String nextLine() throws Exception {
        return reader.readLine();
    }

    public String nextString() throws Exception {
        while (!tok.hasMoreTokens())
            tok = new StringTokenizer(reader.readLine());
        return tok.nextToken();
    }

    public long nextLong() throws Exception {
        return Long.parseLong(nextString());
    }

    public double nextDouble() throws Exception {
        in.nextToken();
        return in.nval;
    }

    public class pair {
        int x;
        int y;

        public pair(int x, int y) {
            this.x = x;
            this.y = y;
        }
    }

    public int gcd(int a, int b) {
        if (a == 0 || b == 0)
            return 1;
        if (a < b) {
            int c = b;
            b = a;
            a = c;
        }
        while (a % b != 0) {
            a = a % b;
            if (a < b) {
                int c = b;
                b = a;
                a = c;
            }
        }
        return b;
    }

    public int pow(int a, int n) {
        if (n == 0)
            return 1;
        int k = n, b = 1, c = a;
        while (k != 0) {
            if (k % 2 == 0) {
                k /= 2;
                c *= c;
            } else {
                k--;
                b *= c;
            }
        }
        return b;
    }

    public int lcm(int a, int b) {
        return a * b / gcd(a, b);
    }

    public class pairs implements Comparable<pairs> {
        int x;
        int y;

        public pairs(int x, int y) {
            this.x = x;
            this.y = y;
        }

        @Override
        public int compareTo(pairs obj) {
            if (this.x < ((pairs) obj).x)
                return 1;
            else if (this.x == (obj).x && this.y < (obj).y)
                return 1;
            else if (this.x == (obj).x && this.y == (obj).y)
                return 0;
            else
                return -1;
        }
    }

    public class Graf {

        int[][] a;
        int[] colors;
        ArrayList<String> points = new ArrayList<String>();
        LinkedList<Integer> queue = new LinkedList<Integer>();
        boolean[] used;
        boolean cycle;
        int numberOfCycle;

        public Graf(int[][] a, String s[]) {
            this.a = new int[s.length][s.length];
            this.a = a;
            this.colors = new int[s.length];
            this.used = new boolean[s.length];
            for (int i = 0; i < s.length; i++) {
                this.colors[i] = 0;
                this.points.add(s[i]);
            }
            Arrays.fill(this.used, false);
        }

        public void bfs(int i) {
            this.queue.add(i);
            while (!this.queue.isEmpty()) {
                i = this.queue.pop();
                out.print(points.get(i) + " ");
                this.used[i] = true;
                for (int j = 0; j < this.points.size(); j++) {
                    if (this.a[i][j] == 1 && !this.queue.contains(j)
                            && !this.used[j]) {
                        this.a[i][j] = 0;
                        this.a[j][i] = 0;
                        this.queue.addLast(j);
                    }
                }
            }
        }

        public void dfs(int i) {
            this.colors[i] = 1;
            out.print(points.get(i) + " ");
            for (int j = 0; j < this.colors.length; j++) {
                if (this.a[i][j] == 1 && this.colors[j] == 0) {
                    this.colors[j] = 1;
                    this.a[i][j] = 0;
                    this.a[j][i] = 0;
                    dfs(j);
                } else if (this.a[i][j] == 1 && this.colors[j] == 1) {
                    this.cycle = true;
                    this.numberOfCycle++;
                }
            }
            this.colors[i] = 2;
        }
    }

    public class Time {

        int h;
        int min;
        int sec;

        public Time(String s) {
            String[] st = s.split(":");
            this.h = Integer.parseInt(st[0]);
            this.min = Integer.parseInt(st[1]);
            this.sec = (st[2] != null) ? Integer.parseInt(st[2]) : 0;
        }

        public String toString(int a) {
            String h = Integer.toString(this.h);
            String min = Integer.toString(this.min);
            String sec = Integer.toString(this.sec);
            if (h.length() == 1) {
                h = '0' + h;
            }
            if (min.length() == 1) {
                min = '0' + min;
            }
            if (sec.length() == 1) {
                sec = '0' + sec;
            }
            if (a == 5) {
                return h + ":" + min;
            } else {
                return h + ":" + min + ":" + sec;
            }
        }

        public void to12HoursFormat() {
            h %= 12;
        }

        public void add(int h, int min, int s) {
            this.sec += s;
            if (this.sec >= 60) {
                this.min++;
                this.sec %= 60;
            }
            this.min += min;
            if (this.min >= 60) {
                this.h++;
                this.min %= 60;
            }
            this.h += h;
            if (this.h >= 24) {
                this.h %= 24;
            }
        }
    }

    public int[] findPrimes(int x) {
        boolean[] erat = new boolean[x - 1];
        List<Integer> t = new ArrayList<Integer>();
        int l = 0, j = 0;
        for (int i = 2; i < x; i++) {
            if (erat[i - 2])
                continue;
            t.add(i);
            l++;
            j = i * 2;
            while (j < x) {
                erat[j - 2] = true;
                j += i;
            }
        }
        int[] primes = new int[l];
        Iterator<Integer> iterator = t.iterator();
        for (int i = 0; iterator.hasNext(); i++) {
            primes[i] = iterator.next().intValue();
        }
        return primes;
    }

    public double dist(pair a, pair b) {
        return sqrt((a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y));
    }

    public int[] prefixFunction(String s) {
        int n = s.length();
        int[] p = new int[n];
        for (int i = 1; i < n; i++) {
            int k = p[i - 1];
            while (k > 0 && s.charAt(k) != s.charAt(i)) {
                k = p[k - 1];
            }
            p[i] = k + (s.charAt(k) == s.charAt(i) ? 1 : 0);
        }
        return p;
    }

    public void solve() throws Exception {
        StringBuffer s = new StringBuffer(nextLine());
        int[] e = new int[s.length()];
        e = prefixFunction(s.toString());
        int n = s.length();
        if (n == 2) {
            out.println("Just a legend");
            return;
        }
        if (e[n - 1] == 0) {
            out.printf("Just a legend\n");
            return;
        }
        for (int i = 1; i < n - 1; ++i) {
            if (e[i] == e[n - 1]) {
                out.printf("%s\n", s.substring(0,e[n - 1]));
                return;
            }
        }
        if (e[e[n - 1] - 1] == 0)
            out.printf("Just a legend\n");
        else {
            out.printf("%s\n", s.substring(0,e[e[n - 1] - 1]));
        }
    }
}